我有这样的文字:
node1: connect command: ssh [email protected] password: qcipunbnctza
node2: connect command: ssh [email protected] password: ejrpnnwsczpa
node3: connect command: ssh [email protected] password: pkrpxmyxnxuu
我需要将 IP 地址和密码保存到变量中,然后将其传递给脚本。我该如何高效地做到这一点?我的脚本是:
#/bin/bash
declare -a IPS=($1 $2 $3)
CONFIG_FILE=inventory/sks-cluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
echo $4 > host1.txt
echo $5 > host2.txt
echo $6 > host3.txt
ssh-keyscan $1
ssh-keyscan $2
ssh-keyscan $3
sshpass -f host1.txt ssh-copy-id user@$1
sshpass -f host2.txt ssh-copy-id user@$2
sshpass -f host3.txt ssh-copy-id user@$3
答案1
尝试这样的事情:
#!/bin/bash
export SSHPASS
awk -F'[@ ]' '{print $5, $6, $8}' hostlist.txt |
while read -r username host SSHPASS ; do
echo ssh-keyscan "$host"
echo sshpass -e ssh-copy-id "$username@$host"
done
这使用 awk 单行代码从名为 的文件中提取用户名、主机名/IP 地址和每一行的密码hostlist.txt
,并将输出通过管道输送到while
循环中。
该while
循环处理每个输入行的输出,并将其与and 一起awk
使用(使用选项而不是,以便使用环境变量而不是文件)。ssh-keyscan
sshpass
-e
-f
$SSHPASS
SSHPASS
sshpass
被导出以确保它在运行时在环境中可用。
echo
注意:我之前使用过ssh-keyscan
并sshpass
使其成为一次试运行(并且因为如果我的系统不必浪费时间尝试使用 ssh-keyscan 和 ssh-pass+ssh 连接到这些 IP 地址,测试速度会更快-副本 ID)。echo
当您确定它会按预期工作时,请从两行中删除。
答案2
这是一个非常幼稚的方法。
如果调用您的脚本yourscript.sh
并且数据位于名为nodes.txt
yourscript.sh $(cat nodes.txt | tr '@' ' ' | cut -f6 -d' '; cut -f7 -d' ' nodes.txt)