运行ssh并立即执行命令

235

我正在寻找在连接到SSH服务器后运行命令的UNIX或bash命令。 例如:

ssh name@ip "tmux list-sessions"

上面的代码可以工作,它列出了会话,但随后立即断开连接。将其放在服务器端的sshrc中可以解决问题,但我需要能够在客户端输入它。我希望能够运行一个命令,它登录,打开窗口,然后运行我设置的命令。我已经试过。
[command] | ssh name@ip

ssh name@ip [command]

ssh name@ip "[command]"

ssh -t name@ip [command]

12
你想在远程服务器上运行一个命令,然后进入一个交互式的 shell 环境吗? - Barmar
@tripleee 根据日期而不是这个问题,另一个问题是重复的。 - zviad
@zviad 当将某个问题标记为重复时,问题的年龄是次要或第三要考虑的因素。在这种特定情况下,我没有强烈的意见,尽管我认为也许其他问题更有可能被新用户识别为询问此特定问题的解决方案。理想情况下,如果两个问题都有有价值的答案,网站管理员可以合并这两个问题,但我从未见过实践中出现这种情况。 - tripleee
3
如果你想要向远程服务器发送命令并保持连接,可以使用以下命令:ssh name@server "command; bash -i" - JP Zhang
3个回答

367
ssh destination -t 'command; bash -l'

执行命令后,将启动一个登录shell。例如:
ssh -t user@domain.example 'cd /some/path; bash -l'

3
忘记了自己的语法,差点放弃了!对于其他人,只需在任何命令后面添加“; bash -l”。也许你可以更改为“[命令]; bash -l”或类似的方式以增加清晰度?我将修改我的问题。谢谢! - cadlac
10
我认为使用 exec bash -l 更好。 - Jo So
4
功能正常,但这会隐藏命令提示符。有没有办法让它以通常的方式显示出来? - pythonjsgeo
4
如果您尝试运行的脚本需要使用bash环境变量,该怎么办? - NobleUplift
4
@NobleUplift 在输入命令前,可以先显式地执行 source .bash_profile 命令。该操作可确保所需的环境变量和别名已经被正确加载。 - Barmar
显示剩余13条评论

9

虽然这并不是您要寻找的东西,但在类似情况下,我发现它很有用。

最近我在$HOME/.bashrc中添加了以下内容(其他shell应该也可以实现类似功能):

if [ -f $HOME/.add-screen-to-history ] ; then
    history -s 'screen -dr'
fi

我在一台特定的机器上运行了一个 screen 会话,我遇到了 ssh 连接中断的问题,每次重新连接都需要重新运行 screen -dr 命令。
通过添加这一条命令,并在我的主目录中创建这个(空)文件之后,当我的 shell 启动时,就自动将 screen -dr 命令添加到了我的历史记录中。重新连接后,只需键入 Control-P Enter 就可以回到我的 screen 会话中 -- 或者我可以忽略它。这很灵活,但并不是完全自动化,对于你来说比输入 tmux list-sessions 命令更容易些。
你可能会想要让 history -s 命令无条件地执行。
这确实需要更新每个目标系统的 $HOME/.bashrc,这可能或可能不适合你的需求。

这非常有用,但我注意到历史记录会被清除,除了在新登录时的新命令。你知道为什么会发生这种情况以及如何防止它吗?我刚刚注意到,在.bashrc中注释掉该行后,完整的历史记录现在可用。 - Andy

3

如果启用了PermitLocalCommand选项,您可以使用LocalCommand命令行选项:

ssh username@hostname -o LocalCommand="tmux list-sessions"

如需更多有关可用选项的详细信息,请参阅ssh_config手册页。


1
对于我来说,(在OS X系统上)这应该是ssh -o“ LocalCommand tmux list-sessions”user@hostname - Erik Nomitch
52
这个答案基于对问题的误解。这个问题是关于连接后立即在远程服务器上运行命令的。LocalCommand(顾名思义)在本地计算机上运行一个命令。 - robo
7
RemoteCommand是你在这里寻找的选项。ssh name@ip -t -o RemoteCommand="tmux ls; bash" 参考:https://man.openbsd.org/ssh_config#RemoteCommand - Hockey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接