在脚本中使用 ssh-copy-id 命令时出现问题

Posted

技术标签:

【中文标题】在脚本中使用 ssh-copy-id 命令时出现问题【英文标题】:Problem when using the ssh-copy-id command in script 【发布时间】:2021-10-07 12:24:15 【问题描述】:

我写这个是为了自动从列表中添加 SSH 连接,但是当我运行这个脚本时出现错误!我认为这个问题与从脚本中的$line 变量读取 ip 有关。

我的脚本:

#!/bin/bash

filename='iplist.txt'
n=1
USER=root
SSHPASS=123456

while read line; do
echo "No. $n : IP = $line"
echo "yes \n" | sshpass -p "$SSHPASS" \
ssh-copy-id -o StrictHostKeyChecking=no $USER@$line \
&& echo "Add successfully!" || echo "FAILED"

echo "########################################"
n=$((n+1))
sleep 2
done < $filename

iplist.txt 是一个包含我的 IP 的文件:

172.25.25.1
172.25.25.2 

这是我的脚本的结果:

No. 1 : IP = 172.25.25.1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

: Name or service not known: ssh: Could not resolve hostname 172.25.25.1

FAILED
########################################

No. 2 : IP = 172.25.25.2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

: Name or service not known: ssh: Could not resolve hostname 172.25.25.2

FAILED
########################################

【问题讨论】:

在您的脚本中输入一个有效的shebang 并将其粘贴到shellcheck.net 以进行验证/建议。 避免大写变量,因为内部/环境变量都是大写的。就像您的示例中的 USER 一样,对内置 read 使用不同的 fd ,使用更多引号等等...... @Jetchisel THX,但您的 cmets 无法解决我的问题。 @Jetchisel 如果我设置例如line=172.25.25.1 我的脚本运行成功但无法从文件中读取! Los like windows to Linux issue... 【参考方案1】:
    检查文件结尾,如果它们是 Windows 的 CRLF、mac 的 CR 或 linux 的 LF。 同时读取 -r 行;做命令;完毕 传递给 read 命令的 -r 选项可防止反斜杠转义被解释。 在读取命令之前添加 IFS= 选项以防止前导/尾随空格被修剪 - while IFS= read -r line; do COMMAND_on $line; done

上面的代码是一个例子,你可能想使用 -r 参数。对于 IFS,您可能不想使用它,因为如果有任何空格,那么 IFS 会保留它而不是删除它们。

【讨论】:

以上是关于在脚本中使用 ssh-copy-id 命令时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

迭代 ssh-copy-id 命令以在多个主机上复制

shell脚本实现ssh-copy-id批量自动发送公钥到远程主机

使用sshpass 和 ssh-copy-id批量拷贝公钥到远程主机

Linux中,使用SSH过程中,sh-copy-id命令报错:-bash: ssh-copy-id: command not found

Linux 命令(210)—— ssh-copy-id 命令

Linux 命令(210)—— ssh-copy-id 命令