我正在写一个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 ",但它不起作用显示" 密码:"在屏幕上仍然等待密码.. 我希望你理解我,谢谢你。
答案 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
错误。