问题描述:
在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
命令将从临时文件描述符中读取密码,而不是从重定向的标准输入中读取密码,这样就能够按预期工作了。