bash - shell脚本中自动应答ssh-copy-id

标签 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”,但它不起作用,它在屏幕上显示“密码:”,并且仍在等待密码.. 希望您理解我并谢谢您。

最佳答案

正如@Leon 指出的,你的管道是倒退的。但即使您按照正确的顺序执行此操作,它仍然无法工作,因为 ssh-copy-id (以及 openssh 中的所有其他程序)不会从它们的标准输入。解决方案是使用 $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 将执行该脚本。现在,脚本应该通过将密码打印到其标准输出来向 ssh-copy-id 提供密码。我们使用 $PASS 变量作为脚本的密码,因此脚本只打印该变量。

关于bash - shell脚本中自动应答ssh-copy-id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275038/

相关文章:

shell - KornShell 中的变量赋值

objective-c - 在 mac 平台上,如何以编程方式确定用户何时通过 SSH session 登录?

c++ - 使用unix下载html文件

unix - 如何在 UNIX 中删除每行末尾的字符

arrays - 如何通过当前 shell (zsh/bash) 检测数组开始索引?

bash - 连续处理tail -f输出

c - 在 C 程序和 shell 脚本之间共享头文件

linux - 如何使用完整路径从 bash 运行 resque 启动脚本

linux - 有关计算器脚本问题的建议

windows - 使用脚本在 cmd 或 shell 中终止进程