我想要一个单行代码来实现这一点。当我使用以下命令时:
ssh -o ProxyCommand='ssh -W %h:%p user@<jump server>' -t user@<rails server> 'sudo su another_user ; cd /some/dir ; RAILS_ENV=production bundle exec rails console'
我最终进入了 Rails 服务器,但是却没有进入 Rails 控制台:
$(rails server)
然后我尝试退出,认为它不起作用:
$(rails server) exit
exit
但是,它锁定了,看起来像上面那样。然后我按下 CTRL-C,出现了一个 ruby 异常。我没有发布 ruby 异常,因为我认为它不相关,而且每次都不一样。它似乎中断了 rails 控制台,但 rails 控制台从未出现在我面前。
答案1
您的问题似乎出在命令的这一部分
sudo su another_user ; cd /some/dir ; RAILS_ENV=production bundle exec rails console
这将依次调用三个命令。每个命令都将等待前一个命令完成。
第一个命令sudo su another_user
将以 another_user 身份启动 shell。一旦您离开该 shell,将执行以下命令。
命令cd /some/dir ; RAILS_ENV=production bundle exec rails console
将作为用户您以谁的身份登录的。如果您希望这些命令以另一个用户,当它们按如下方式运行时,它们的行为不符合你的预期用户,那么这就解释你的问题了。
也许你的意思是写
sudo su another_user -c "cd /some/dir ; RAILS_ENV=production bundle exec rails console"
或者
sudo su - another_user -c "cd /some/dir ; RAILS_ENV=production bundle exec rails console"
其中 extra-
导致环境变量被更新并且登录脚本被运行为另一个用户在执行其余命令之前。
我之前对这个问题的修订版写的答案
为了提高安全性和易用性,我建议您在客户端主机上运行这两个命令,而在跳转服务器上不运行任何命令。和参数ssh
的组合非常适合这种情况。ProxyCommand
-W
ssh -o ProxyCommand='ssh -W %h:%p jump-server' -t app-server 'cd /some/dir ; rails console'
参数-t
和命令应该涵盖您的其余要求。