帮忙看看这个 shell 脚本,搞不定。。

2021-05-19 10:46:59 +08:00
 mikaelson

#!/bin/bash OLD_INFO=hostlist

for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do

USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)

PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)

PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)

NEW_PASS=$(awk -v I=$IP 'I==$1{print $5}' $OLD_INFO) 

expect -c"

spawn ssh -p$PORT root@$IP

set timeout 15

expect {

    \"(yes/no)\" {send \"yes\r\";exp_continue}
    
    \"password:\" {send \"$PASS\r\";exp_continue}
    
    \"# \" {send \"echo \'$NEW_PASS\'|passwd --stdin $USER\r exit\r\";exp_continue}
    
}"

done

当 hostlist 文件里的多行记录出现同一个 IP 时。。。脚本就不行了,比如内容如下

192.168.128.130 test 123456 22 abc*123

192.168.128.131 a 123456 22 abc*123

我把脚本改成 for line in hostlist,按行读取,再加个 IP 参数,又是另一种错误了。。。

3934 次点击
所在节点    Linux
22 条回复
blessingsi
2021-05-20 20:00:16 +08:00
如果只是执行一行命令,推荐 sshpass,比 expect 简单多了。。
james122333
2021-05-25 22:06:56 +08:00
@mikaelson

写更优雅的脚本

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX