运行 ssh 并立即执行命令 [重复]

Posted

技术标签:

【中文标题】运行 ssh 并立即执行命令 [重复]【英文标题】:Run ssh and immediately execute command [duplicate] 【发布时间】:2013-09-02 13:51:48 【问题描述】:

我正在尝试查找 UNIX 或 bash 命令以在连接到 ssh 服务器后运行命令。例如:

ssh name@ip "tmux list-sessions"

上面的代码有效,它列出了会话,但它立即断开连接。将它放在服务器端的 sshrc 中是可行的,但我需要能够在客户端输入它。我希望能够运行一个命令,它登录,打开窗口,然后运行我设置的命令。我试过了

[command] | ssh name@ip

ssh name@ip [command]

ssh name@ip "[command]"

ssh -t name@ip [command]

【问题讨论】:

您想运行一个命令,然后留在远程服务器上的交互式 shell 中? @tripleee 根据日期不是这个,但另一个问题是重复的。 @zviad 将问题标记为重复时,问题的年龄是次要或第三要考虑的问题。在这种特殊情况下,无论哪种方式,我都没有强烈的意见,尽管我觉得也许另一个问题更有可能被正在寻找解决方案的新用户认为是询问这个特殊问题。理想情况下,如果两个问题都有有价值的答案,网站管理员可以合并这两个问题,尽管我在实践中从未见过。 ssh name@server "command; bash -i" 如果您想向远程服务器发送命令并保持连接 【参考方案1】:
ssh -t 'command; bash -l'

将执行命令,然后在完成时启动登录 shell。例如:

ssh -t user@domain.com 'cd /some/path; bash -l'

【讨论】:

忘记了自己的语法,差点放弃了!对于其他任何人,只需在任何命令后加上“; bash -l”即可。也许您可以将其更改为 '[command]; bash -l' 还是为了清楚起见?我会改变我的问题。谢谢! 我觉得exec bash -l更好。 效果很好,但这对我来说隐藏了命令提示符。有没有办法让它以通常的方式显示? 但是如果您尝试运行的脚本需要 bash 环境变量怎么办? @NobleUplift 你可以在命令前加一个明确的source .bash_profile【参考方案2】:

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

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

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

【讨论】:

对我来说,(OS X)这必须是ssh -o "LocalCommand tmux list-sessions" user@hostname 这个答案是基于对问题的误解。问题是关于在连接后立即在远程服务器上运行命令。 LocalCommand(顾名思义)在本地机器上运行命令。 RemoteCommand 是您在此处寻找的选项。 ssh name@ip -t -o RemoteCommand="tmux ls; bash" 见:man.openbsd.org/ssh_config#RemoteCommand【参考方案3】:

这不是您正在寻找的完全,但我发现它在类似情况下很有用。

我最近在我的$HOME/.bashrc 中添加了以下内容(对于 bash 以外的 shell 应该也可以使用类似的东西):

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 中的行之后,现在可以使用完整的历史记录了。

以上是关于运行 ssh 并立即执行命令 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

使用shell脚本在远程服务器上执行命令[重复]

编写一个shell脚本ssh到远程机器并执行命令

SSH到服务器,Sudo su - 然后在bash中运行命令[重复]

BigQuery 是不是支持“立即执行”命令来运行动态查询?

Linux多台主机批量执行命令