问题描述:
在Bash脚本中,当使用sshpass命令嵌套在while循环中时,sshpass命令无法按预期工作。
示例代码:
#!/bin/bash
while read -r line; do
sshpass -p "password" ssh user@host "command"
done < file.txt
解决方法:
问题出现的原因是sshpass命令会从标准输入读取密码,而while循环已经将标准输入重定向到了file.txt文件。因此,sshpass命令无法从标准输入中获取密码。
为了解决这个问题,可以将sshpass命令重新定向到另一个文件描述符,以便从该文件描述符读取密码。
修改后的代码示例:
#!/bin/bash
while read -r line; do
{ echo "password"; cat; } | sshpass -f- ssh user@host "command"
done < file.txt
在修改后的代码中,我们使用了命令组{ echo "password"; cat; }来生成一个包含密码的临时文件描述符。然后,将该文件描述符通过管道传递给sshpass命令的-f选项。-f-表示从标准输入读取密码。
现在,sshpass命令将从临时文件描述符中读取密码,而不是从重定向的标准输入中读取密码,这样就能够按预期工作了。