在shell脚本中自动回答ssh-copy-id

时间:2016-09-01 15:03:25

标签: bash shell unix ssh scripting

我正在写一个shell脚本,我希望使用 ssh-copy-id 自动登录到远程计算机,所以我打印时手动:

ssh-copy-id -i /root/.ssh/id_rsa $2@$4 -p $3 | echo $1

$ 1参考密码,  $ 2参考用户名,  $ 3参考端口,和  $ 4参考 ip , 没关系,问题是我必须在以下后自动插入密码:

ssh-copy-id -i /root/.ssh/id_rsa $2@$4 -p $3

我添加了这个" | printf $ 1 ",但它不起作用显示" 密码:"在屏幕上仍然等待密码.. 我希望你理解我,谢谢你。

2 个答案:

答案 0 :(得分:2)

正如@Leon指出的那样,你的管道倒退了。但即使您使用正确的顺序执行此操作,它仍然无效,因为ssh-copy-id(以及来自openssh的所有其他程序)都不会从stdin读取密码。解决方案是使用$SSH_ASKPASS环境变量。您可以按如下方式执行此操作:首先,创建一个辅助脚本,比如/var/tmp/ssh-pass.sh(实际上找到一个比这更好的名称),其中包含以下内容:

#!/bin/sh                                                                    
echo "$PASS"

然后您可以使用以下命令来完成您的要求:

PASS="$1" SSH_ASKPASS="/var/tmp/ssh-pass.sh" setsid -w ssh-copy-id -i /root/.ssh/id_rsa "$2"@"$4" -p "$3"

解释:我们使用setsid -w取消ssh-copy-id进程与当前使用的终端的关联。这迫使ssh-copy-id运行$SSH_ASKPASS中指定的可执行文件以获取密码。我们在该变量中指定了自己的脚本,因此ssh-copy-id将执行该脚本。现在,脚本应该通过将其打印到stdout来为ssh-copy-id提供密码。我们将$PASS变量用于脚本的密码,因此脚本只打印该变量。

答案 1 :(得分:0)

2020 / Mac OS X:

安装sshpass (original answer)

brew install hudochenkov/sshpass/sshpass

使用ssh-copy-id并以arg作为密码运行sshpass

sshpass -p $1 ssh-copy-id -i ~/PATH/TO/KEY $2@$4 -p $3

如果您还想关闭严格的主机检查,请使用-o标志,该标志将传递给基础ssh:

sshpass -p hunter2 ssh-copy-id -o StrictHostKeyChecking=no -i ~/PATH/TO/KEY $2@$4 -p $3

我尝试了@redneb的解决方案,并按照this answer通过util-linux安装了setsid,但是一直收到拒绝输入密码的提示。

我发现此策略可用于在成功设置多个树莓派的同时上载SSH密钥。在脚本中,我也每次都运行ssh-keygen -R raspberrypi.local,以避免发生The ECDSA host key for raspberrypi.local has changed错误。