【问题标题】:execute part of shell script on remote machine在远程机器上执行部分 shell 脚本
【发布时间】:2013-10-16 10:03:40
【问题描述】:

我正在通过 shell 脚本登录远程机器(通过在脚本中放置 ssh 命令)。 在 ssh 命令之后,脚本的其余行将在当前机器上执行,而不是在远程机器上执行。如何让其余的 shell 脚本行在远程机器上执行。?

假设这是我的脚本

ssh username@ip-address 
ls
whoami
----

ssh 之后的其余行应该在远程机器上执行,而不是在当前机器上执行。如何做到这一点?

【问题讨论】:

标签: linux shell ssh


【解决方案1】:

一种可能的解决方案是使用heredoc,如下例所示:

$ ssh example.foo.com -- <<@@
> ls /etc/
> cat /etc/passwd
> @@

基本上第一行和最后一行@@之间的所有内容都将在远程机器上执行。

您也可以通过将文件的内容读入变量来使用文件的内容:

$ MYVAR=`cat ~/foo.txt`
$ ssh example.foo.com -- <<@@
> $MYVAR
> @@

或者通过简单地在 heredoc 中执行相同的操作:

$ ssh example.foo.com -- <<@@
> `cat ~/foo.txt`
> @@

【讨论】:

  • 可以说,我有一些 120-130 行需要在远程机器上执行。那么我如何将这些行作为参数传递给 ssh
  • heredoc 仍然可以工作。如果这些行在另一个文件中,则可以将其读入变量,并且可以在 heredoc 中扩展该变量。考虑发出多个命令可能是一个更好的选择,第一个是将文件作为脚本推送到 /tmp 中,第二个是执行它。
【解决方案2】:

您的登录是否无密码。

如果是,你可以直接使用管道在远程机器上执行语句

喜欢:

cat myshellscript.sh | ssh blah@blah.com -q

【讨论】:

  • 我读到无法将密码作为参数传递给 ssh。这是真的吗?...
  • 创建一对密钥是不可能的吗?必须将密码存储在脚本中通常是一个非常糟糕的主意。
  • 您正确地阅读了我的问题。当我将 myshellscript.sh 作为外部文件时,您所说的内容有效。但是我在 shell 脚本中的 ssh 命令之后有大约 100 行代码,我需要在登录远程机器后执行这些行
  • 您可以尝试在我上面的答案中将密码设置为heredoc 的第一行,看看是否有效。我不确定它是否会,但它可以。
  • 你不能创建密钥??即使没有,期望呢?
【解决方案3】:

使用带有-t 选项的ssh 命令。例如:

ssh -t myremotehost 'uptime'
name@myremotehost's password: 
10:14:14 up 91 days, 21:20,  5 users,  load average: 0.20, 0.35, 0.36

【讨论】:

    【解决方案4】:

    ssh -t user@remotehost '正常运行时间' 用户@remotehost 的密码: 23:35:33 上升 2:05,3 个用户,平均负载:0.79、0.52、0.60 与远程的连接已关闭。

    当你指定-t时,它会在远程机器上打开终端并执行命令。

    【讨论】:

      最近更新 更多