尝试运行使用“sshpass”的脚本时权限被拒绝

尝试运行使用“sshpass”的脚本时权限被拒绝

这个想法是让这个脚本运行时不需要输入任何主机密码(写在文件中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

相关内容