如何将文本中的值分配给变量?

如何将文本中的值分配给变量?

我有这样的文字:

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-keyscansshpass-e-f$SSHPASS

SSHPASSsshpass被导出以确保它在运行时在环境中可用。

echo注意:我之前使用过ssh-keyscansshpass使其成为一次试运行(并且因为如果我的系统不必浪费时间尝试使用 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)

相关内容