自动化 ssh-copy-id

dev*_*vin 37 ssh ssh-keys

我有一些具有相同用户/密码组合的任意数量的服务器。我想写一个脚本(我调用一次)以便

ssh-copy-id user@myserver

为每个服务器调用。由于他们都有相同的用户/密码,这应该很容易,但ssh-copy-id希望我每次都分别输入密码,这违背了我的脚本的目的。没有输入密码的选项,即ssh-copy-id -p mypassword user@myserver.

如何编写一个脚本,在ssh-copy-id要求时自动填写密码字段?

qua*_*nta 37

看看sshpass。将您的密码放在一个文本文件中,然后执行如下操作:

$ sshpass -f password.txt ssh-copy-id user@yourserver
Run Code Online (Sandbox Code Playgroud)


小智 23

您可以使用 expect 来监听密码提示并发送您的密码:

#!/usr/bin/expect -f
spawn ssh-copy-id $argv
expect "password:"
send "YOUR_PASSWORD\n"
expect eof
Run Code Online (Sandbox Code Playgroud)

保存脚本,使其可执行,并像这样调用它: ./login.expect user@myserver


小智 6

Quanta 的回答非常好,但它要求您将密码放在文本文件中。

sshpass手册页:

如果没有给出选项,sshpass 从标准输入读取密码。

因此,您可以做的是在脚本期间捕获一次密码,将其存储在一个变量中,回显密码并将其作为输入通过管道传输到 sshpass。

我一直这样做,而且效果很好。例子:

echo "Please insert the password used for ssh login on remote machine:"
read -r USERPASS
for TARGETIP in $@; do
  echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP"
done
Run Code Online (Sandbox Code Playgroud)