这个想法是让这个脚本运行时不需要输入任何主机密码(写在文件中Hosts.txt
)。现在,当我运行这个脚本时,我得到了一个Permission denied, please try again.
答案。
#!/bin/bash
[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z "${2}" ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"
while IFS= read -r host; do
indication="$(sshpass -pfootbar ssh -p 2222 -o StrictHostKeyChecking=no -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$indication" "$host" >> "$OUT_FILE"
done < "$IN_FILE"
抱歉,如果这个问题不清楚,但我对这些事情不太了解。
答案1
看起来消息Permission denied, please try again.
由 SSH 客户端生成。密码应加引号,以转义诸如 、 等字符的特殊$
含义!
(參考):
sshpass -p 'footbar' ...
或者,您可以使用要存储密码的文件(来源):
sshpass -f "/path/to/passwordfile" ...
不过我记得这是我的剧本以前的回答我提到过:“请注意,这里假设有文件和不需要的~/.ssh/config
附加参数(-p 2222
参考)”。我的意思是:
更好的解决方案是(1)设置基于密钥的 SSH 身份验证,(2)创建~/.ssh/config
文件和(3)修改脚本以使用此设置。
1.设置基于密钥的 SSH 身份验证(来源)。
生成 RSA 密钥和不要输入密码:
mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa -b 4096 chmod 600 ~/.ssh/id_rsa
将客户端密钥转移至每个主持人(请笔记引号):
ssh-copy-id "<username>@<host> -p <port_nr>"
现在您应该能够无需密码连接到服务器:
ssh <username>@<host> -p <port_nr>
/etc/ssh/sshd_config
一旦成功,您可以通过以下方式编辑每台主机的文件来禁用密码验证(不太安全的方法) :#PasswordAuthentication yes PasswordAuthentication no
2.创建~/.ssh/config
文件。(另请阅读:如何将具有相同配置的多台机器添加到 ~/.ssh/config?)
该文件的内容
~/.ssh/config
可能如下所示(host-i
是您选择的对象):Host host-1 HostName <domain-or-IP-address> IdentityFile ~/.ssh/id_rsa User <username> Port 2222 # other parameters... Host host-2 HostName <domain-or-IP-address> IdentityFile ~/.ssh/id_rsa User <username> Port 2222 # other parameters... Host host-3...
更改文件权限:
chmod 600 ~/.ssh/config
现在你应该能够通过以下命令连接到每个主机:
ssh host-1
3.A.您可以继续使用上述脚本,但需进行少许修改:
#!/bin/bash
[[ -z $1 ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z $2 ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"
while IFS= read -r host; do
indication="$(ssh -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$indication" "$host" >> "$OUT_FILE"
done < "$IN_FILE"
在这种情况下,Hosts.txt
文件应该是:
host-1
host-2
host-3
3.B.或者您可以以更通用的方式修改脚本:
#!/bin/bash
# Collect the user's input, and if it`s empty set the default values
[[ -z $1 ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
# Provide the list of the hosts as an array
HOSTS=("host-1" "host-2" "host-3")
for host in "${HOSTS[@]}"; do
indication="$(ssh -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$host" "$indication" >> "$OUT_FILE"
done