Run ssh and immediately execute command
我试图找到unix或bash命令,以便在连接到ssh服务器之后运行命令。例如:
1
| ssh name@ip"tmux list-sessions" |
上面的代码可以工作,它列出了会话,但随后会立即断开连接。把它放在服务器端的sshrc中是可行的,但我需要能够在客户端键入它。我希望能够运行一个命令,它登录,打开窗口,然后运行我设置的命令。我试过了
1 2 3 4 5 6 7
| [command] | ssh name@ip
ssh name@ip [command]
ssh name@ip"[command]"
ssh -t name@ip [command] |
- 您想运行一个命令,然后留在远程服务器上的交互式shell中吗?
- @根据日期分三次,不是这个,但另一个问题是重复的。
- @当把某事物标记为复制品时,问题的年龄是第二或第三个关注点。在这种特殊情况下,我也没有强烈的意见,尽管我觉得另一个问题可能更容易被寻找解决方案的新用户认为是在问这个特殊问题。理想情况下,如果两个问题都有有有价值的答案,那么一个网站的主持人可以合并这两个问题,尽管我在实践中从未见过。
1
| ssh -t 'command; bash -l' |
将执行该命令,然后在完成时启动登录shell。例如:
1
| ssh -t user@domain.com 'cd /some/path; bash -l' |
- 忘了我自己的语法,差点就放弃了!对于其他任何人,只要在任何命令后面加上"bash-l"。也许你可以把它改成'[command];bash-l'或者其他什么东西,看在Clarities的份上?我会改变我的问题。谢谢!
- 我觉得对exec bash -l更好。
- 很好,但是如果您希望命令出现在bash历史中呢?
- 不知道如何将一个命令推进历史。
- 工作得很好,但这隐藏了我的命令提示。有没有办法让它以通常的方式显示?
- 我在尝试时得到命令提示。检查您的shell启动脚本,看看它们在设置提示时测试了什么,并找出为什么在这种情况下不进行设置。
- @巴玛:你能看看这个类似的问题stackoverflow.com/questions/29255177/…
- 但是,如果您试图运行的脚本需要bash环境变量呢?
- @nobleuplift您可以在命令之前放置一个显式的source .bash_profile
- ssh-i"key.pem"[email protected]"sudo su",但它不切换到超级用户
- @ceoatapartico不确定这与这个问题有什么关系,这个问题是关于在执行其他命令之后进入shell的。
- 对于使用宅基地的人来说,这对我很有用:homestead.bat ssh -- -t 'cd /home/vagrant/Code/mysite/; ./vendor/bin/phpunit; /bin/bash'(stackoverflow.com/a/22529114/470749)
- 登录后,我通常将shell改为bash。试图通过上面的方法来实现自动化是不可行的。如果可以的话有什么帮助吗?我正在尝试'ssh$host-t"bash;cd workspace;"
- @mtk serverfault.com/questions/368054/…
- 工作很好。进入登录shell后,我想启动一个Rails控制台,类似于:ssh 123.123.123.123 -t 'cd myapp; bash -l; rails console'。有什么想法吗?谢谢。
- @乔舒品特,你为什么需要bash?就这样。
- @Barmar我得到一个rails错误,它只在我不使用bash -l时出现。错误是database configuration does not specify adapter。也许这是一个bash环境的问题。我试过source .bashrc,但没用。不知道该如何找出bash -l的情况,这使它工作得很好。
- 尝试购买你的.profile或.bash_profile。
- 乔·苏的回答是正确的。在MacOS上,我可以成为ssh会话然后自动打开的唯一方法,比如说,gnome磁盘是:ssh -Y root@cheese exec gnome-disks。
如果启用了PermitLocalCommand选项,则可以使用LocalCommand命令行选项:
1
| ssh username@hostname -o LocalCommand="tmux list-sessions" |
有关可用选项的更多详细信息,请参阅ssh_config手册页。
- 对我来说,(操作系统x)必须是ssh -o"LocalCommand tmux list-sessions" user@hostname。
- 这个答案是基于对问题的误解。问题是在连接后立即在远程服务器上运行命令。local command(顾名思义)在本地计算机上运行一个命令。
这不是你想要的,但我发现它在类似的情况下很有用。
我最近在我的$HOME/.bashrc中添加了以下内容(对于bash以外的shell,应该可以使用类似的内容):
1 2 3
| if [ -f $HOME/.add-screen-to-history ] ; then
history -s 'screen -dr'
fi |
我在一台特定的机器上运行一个screen会话,并且我遇到了与该机器的ssh连接中断的问题,每次重新连接时都需要重新运行screen -dr。
有了这个添加,在我的主目录中创建了这个(空)文件之后,当shell启动时,我会自动在我的历史记录中使用screen -dr命令。重新连接后,我只需键入control p enter,就可以回到我的屏幕会话中——或者我可以忽略它。它很灵活,但不是很自动,在您的情况下,它比键入tmux list-sessions容易。
您可能希望使history -s命令无条件。
这需要在每个目标系统上更新您的$HOME/.bashrc,这可能会使它不适合您的目的。
- 这是非常有用的,但是我注意到历史记录将被清除,除了新登录时的新命令。你知道为什么会发生这种情况吗?你怎么能阻止呢?我刚刚注意到,在我注释掉了.bashrc中的行之后,完整的历史记录现在可以使用了。