我有一个要求应该解决以下几点。
对于每个IP,我需要使用SSH推送以下命令(所有都是Mikrotik设备)
/ radius add service=login address=172.16.0.1 secret=aaaa
/ user aaa set use-radius=yes
以下是我的代码。
#!/bin/bash
filename="branch"
while IFS= read line; do
echo ${line//}
line1=${line//}
ok='@'
line3=$ok$line1
sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3 / radius add service=login address=172.16.0.1 secret=aaaa
sleep 3
sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3 / user aaa set use-radius=yes
sleep 3
echo $line3
echo $line
done <"$filename"
分支文本文件:
192.168.100.1
192.168.101.2
192.168.200.1
问题:我正在做什么改变虽然循环只运行一次。
故障排除/观察: 没有SSH命令,如果我运行While循环来读取文件&#34;分支&#34;它工作正常。
答案 0 :(得分:0)
问题是循环中的程序还读取标准输入的数据。这将消耗"$filename"
中的第二行和后续行。
在循环的下一次迭代中,没有任何内容可供阅读,循环终止。
解决方案是识别读取stdin的命令,可能是sshpass
并将其更改为单独留下stdin。赛勒斯的回答显示了ssh
的一种方法。如果这不起作用,请尝试
sshpass [options and arguments here] < /dev/null
另一种解决方案是用while
循环替换for
。只要branch
文件只包含IP地址,
for ip in $(cat branch); do
echo $ip
...
sshpass ...
done