Ruby net/ssh 不是后台的 运行 bash 命令

Ruby net/ssh is not running bash commands in background

我很难从 Ruby 脚本中 运行 在后台执行 bash 命令。

对于这个问题,我使用了一个简化的例子。

这是我从 PuTTY 运行 命令按预期工作的方式。

running basch commands in background (点击查看图片,因为 StackOverlow 还不允许我显示图片)

现在,我尝试使用下面显示的这个小脚本从 Ruby 复制它:

ruby script (点击查看图片,因为 StackOverlow 还不允许我显示图片)

这是我在 运行 这样的 Ruby 脚本时得到的结果:

script output (点击查看图片,因为 StackOverlow 还不允许我显示图片)

为了您的分析,这里是 Ruby 脚本的转录:

require 'net/ssh'
net_remote_ip = '74.****122'
ssh_username = 'bots'
ssh_password = 'San*****'
get_ssh_port = '22'
ssh = Net::SSH.start(net_remote_ip, ssh_username, :password => ssh_password, :port => get_ssh_port)
s = "bash --login -c 'sleep 600' &"
print "run (#{s})... "
stdout = ssh.exec!(s)
puts "done (#{stdout.strip})"
ssh.close
exit(0)

您需要将 stdout 和 stderr 重定向到终端以外的其他地方,否则 exec! 将挂起等待进程输出。

这是我找到的最简单的解决方案:

ssh.exec!("sleep 600 &> /dev/null &")

&> 同时重定向 stdin 和 stderr。 如果你想重定向日志输出,如果你愿意,你可以单独这样做:

ssh.exec!("command 2> error.log > output.log &")