Is there any way i can get a login shell in ruby using net-ssh? Is that even possible?
By login shell i mean the ones the source /etc/profile..
There is a nicer way to do this now. Instead you can use a shell subsystem with a pty to get everything you would expect from a shell login:
Net::SSH.start(@config.host, @config.user, :port => @config.port, :keys => @config.key, :config => true) do |session|
session.open_channel do |channel|
channel.request_pty
channel.send_channel_request "shell" do |ch, success|
if success
ch.send_data "env\n"
ch.send_data "#{command}\n"
ch.on_data do |c, data|
puts data
end
end
channel.send_data "exit\n"
channel.on_close do
puts "shell closed"
end
end
end
end
end
Net-SSH is too low level to simply provide this up front (the way it is now, anyways). You can check out Net-SSH-Shell which builds upon Net-SSH to add login shell functionality: https://github.com/mitchellh/net-ssh-shell
The implementation is solid and works, however I found its not too useful since you can't specifically extract things like stderr or exit status because the commands run in a sub-shell, so you can only get stdout. The net-ssh-shell library uses some hacks to get the exit status.
I've needed a "login shell" for my own Ruby projects and to do this I've generally executed things directly into the shell using the following code:
With this solution you still don't get exit status or stderr of commands run into the login shell, but at least the commands are executed in that context.
I hope this helps.