使用 shell 脚本在远程机器上执行多个命令

Posted

技术标签:

【中文标题】使用 shell 脚本在远程机器上执行多个命令【英文标题】:Multiple commands on remote machine using shell script 【发布时间】:2011-04-26 09:31:05 【问题描述】:

我在远程机器上有一个 Java 程序 Desktop/testfolder/xyz.jar。它在同一文件夹中有一个配置文件。当我通过 SSH 连接到机器时,我会这样做:

"ssh user@remote java -cp Desktop/testfolder/xyz.jar Main"

这里的问题是配置文件不在路径中,因为我们在主文件夹中,所以我的程序无法读取配置。

我想先进入那个文件夹,然后从那个文件夹运行程序。如果我这样做,在 shell 脚本中

"ssh user@remote cd Desktop/testfolder"
"java -cp xyz.jar Main"

它执行第一条语句,当第二条语句运行时,它在我当前的机器上运行,而不是在远程机器上。

我们可以只执行一个命令还是有其他解决方案?

【问题讨论】:

What is the cleanest way to ssh and run multiple commands in Bash?的可能重复 【参考方案1】:

您可以尝试用分号分隔命令:

ssh user@remote "cd Desktop/testfolder ; java -cp xyz.jar Main"

【讨论】:

请务必注意这两个运算符之间的区别:&&;&& 表示第二个命令将执行当且仅当第一个命令执行并返回退出状态为零(无错误)while ; 允许执行以下命令,无论其退出状态如何。 另外值得注意的是,在有分号的字符串中允许使用换行符。 (是的,regular strings can span multiple lines in sh 和派生词,根本没有任何额外的语法。) ...在这里更明确地说明先前评论的相关性-使用;而不是&&意味着可以在错误的目录中调用java解释器如果 cd 失败,而 ; 会阻止它。因此使用&& 更正确。【参考方案2】:

试试这样的:

ssh you@yours.com "cd /home && ls -l"

【讨论】:

感谢两位 cmets 的帮助! 不客气!如果命令的第一部分“有效”,Trey 和我的回答做同样的事情 - 如果第一部分失败,带有 && 的版本不会执行命令的第二部分。例如,将ssh you@yours.com "cd /non-existant ; ls -l"ssh you@yours.com "cd /non-existant && ls -l" 进行比较。在第一种情况下,您仍然可以从ls -l 命令获得一些输出(即使cd 失败 - 可能是you 用户的主目录),在后一种情况下,ls -l 命令被跳过,因为第一个操作数返回false【参考方案3】:

如果您想将命令拆分为多行以便于阅读,您还可以将命令列表传递给bash 命令,如下所示:

ssh user@remote.host bash -c "'
  cd Desktop/testfolder
  java -cp xyz.jar Main
'"

【讨论】:

以上是关于使用 shell 脚本在远程机器上执行多个命令的主要内容,如果未能解决你的问题,请参考以下文章

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

linux怎么远程执行另一台linux机器上的shell文件?

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

一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

shell脚本中怎么ssh上远程机执行命令

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