如何从 bash 脚本中 ssh?

Posted

技术标签:

【中文标题】如何从 bash 脚本中 ssh?【英文标题】:How to ssh from within a bash script? 【发布时间】:2010-12-26 02:17:31 【问题描述】:

我正在尝试创建一个 ssh 连接并从脚本中在远程服务器上做一些事情。

但是终端提示我输入密码,然后在终端窗口而不是脚本中打开连接。在我退出连接之前,这些命令不会被执行。

【问题讨论】:

【参考方案1】:

您需要为运行脚本的用户交换 SSH 密钥。看看this tutorial

完成此操作后,您的脚本将无需输入密码即可运行。但是,为了安全起见,您不想为 root 用户执行此操作!

【讨论】:

【参考方案2】:

    如果您希望密码提示消失,请使用基于密钥的身份验证 (described here)。

    要通过 ssh 远程运行命令,您必须将它们作为 ssh 的参数提供,如下所示:

root@host:~ # ssh root@www 'ps -ef | grep 阿帕奇 | grep -v grep | wc -l'

【讨论】:

如果我有多行(只是为了代码清晰),我该如何将它传递给 ssh? 使用分号作为命令分隔符。 cd /var/www; cp foo bar; @blong 你可以试试heredoc,见这里:***.com/a/4412338/5359531 已经有 4 年了,所以我现在才知道 heredocs :) 不过,感谢分享这个 @user5359531 !【参考方案3】:

如果您想继续使用密码而不是使用密钥交换,那么您可以使用 'expect' 来完成此操作,如下所示:

#!/usr/bin/expect -f
spawn ssh user@hostname
expect "password:"
sleep 1
send "<your password>\r"
command1
command2
commandN

【讨论】:

-bash: ./test.sh: /usr/bin/expect: 错误的解释器:没有这样的文件或目录【参考方案4】:

还有另一种使用共享连接的方法,即:有人使用密码启动连接,然后每个后续连接都将在同一通道上多路复用,从而无需重新验证。 (而且速度也更快)

# ~/.ssh/config 
ControlMaster auto
ControlPath ~/.ssh/pool/%r@%h

那么你只需要登录,只要你登录了,bash脚本就能打开ssh连接。

然后,当有人尚未打开频道时,您可以通过以下方式停止脚本工作:

ssh ... -o KbdInteractiveAuthentication=no ....

【讨论】:

以上是关于如何从 bash 脚本中 ssh?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 bash 脚本将 ssh 密钥添加到主机

通过 SSH 执行存储在文件中的 Bash 脚本

从 bash 脚本中通过 ssh 在远程主机上执行命令

当我中断 ssh 本身时,如何使 ssh 杀死远程进程?

如何在 ssh / 远程 bash 命令中转义单引号字符?

从变量添加 SSH 密钥