关于bash:如何使用带有来自变量的空白密码的sshpass?

How can I use sshpass with a blank password coming from a variable?

本问题已经有最佳答案,请猛点这里访问。

我想写一个脚本,它可以在不需要任何用户交互的情况下ssh到Linux目标中。我的脚本运行的机器以及我每天晚上尝试ssh到的目标都会被重新格式化,所以我不能使用ssh keygen(据我所见),因为在设置密钥时需要手动输入目标的密码。所以我尝试使用sshspass。下面是一个简单的示例,说明我希望如何使用它:

1
2
3
4
5
6
7
#!/bin/bash
host=$1
user=$2
pass=$3

sshpass -p $pass scp myfiles.tar.gz $user@$host:/
sshpass -p $pass ssh $user@$host"tar xvf myfiles.tar.gz"

除非目标的密码为空,否则此操作正常。如果相反,我写:

1
2
sshpass -p"" scp myfiles.tar.gz $user@$host:/
sshpass -p"" ssh $user@$host"tar xvf myfiles.tar.gz"

对于那个目标来说,命令可以正常工作。所以我希望能够用我使用的"pass"变量来实现这一点。我试过像

1
2
3
4
5
pass=""
pass=""""
pass="''"
pass="
"

但它们似乎都不起作用。有人知道我需要将"pass"变量设置为什么吗?


总是引用变量:

1
2
3
4
...
pass=""
sshpass -p"$pass" scp myfiles.tar.gz"$user@$host:/"
sshpass -p"$pass" ssh"$user@$host""tar xvf myfiles.tar.gz"

这可以防止空字符串消失,还可以防止其他问题,如空格分隔的密码和星号转换为文件名的密码。

PS:ShellCheck会自动指出这一点。