gpt4 book ai didi

linux - 使用expect通过ssh和密码传输命令

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:50 25 4
gpt4 key购买 nike

我需要迭代一系列服务器(许多类型的服务器,每种类型的服务器存储在单独的文件中),在它们上运行一些命令(根据服务器类型存储在不同的文件中)并使用带密码的 ssh 将输出记录在本地计算机上。由于 sshpass、ssh key 身份验证不是我的情况的解决方案,请不要推荐它们。

这是我的代码:

#!/usr/local/bin/expect -f
#Set path to nodes files
NODES=nodes/*
#Set path to commands files
CMD=commands/*

for fn in $NODES
do
echo "Working in $fn"
for fc in $CMD
do
echo "Working in $fc"
if [ ${fn:6:3} = ${fc:9:3} ]
then
# read Nodes from file
while read fn_line; do
#extracting substrings of user, host, password separated by comma
IFS=', ' read -a uhp <<< $fn_line
#establish ssh session to the node
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no ${uhp[0]}@${uhp[1]}
echo ${uhp[0]} ${uhp[1]} ${uhp[2]}
#use correct prompt
set prompt "assword:*"
interact -o -nobuffer -re $prompt return
send "${uhp[2]}\r"
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
#execute and logging HC commands on the node
while read fc_line; do
#set prompt ":|#|\\\$"
#interact -o -nobuffer -re $prompt return
echo "$fc_line\r" >> logs/${fn:6:3}.log
$fc_line\r >> logs/${fn:6:3}.log
#interact -o -nobuffer -re $prompt return
done < $fc
done < $fn
fi
#cat $f
done
done

我知道在我的代码中问题是 bash 和 Expect 解释器的组合。请帮助我只以expect 风格来做这件事,或者告诉我如何将bash 与expect 结合起来。另一个问题是建立ssh连接后的一段时间,但我认为可以通过将其预先存储在数组中并在建立ssh连接后循环它来解决。

最佳答案

如何在expect中编写一个小实用程序来生成ssh命令:

#!/usr/bin/expect
set HOST [lindex $argv 0]
set PORT [lindex $argv 1]
set USER [lindex $argv 2]
set PASSWORD [lindex $argv 3]
set COMMAND [join [lrange $argv 4 end] " "]
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -p $PORT $USER@$HOST $COMMAND
expect "assword:"
send "$PASSWORD\r"
expect eof
exit

并在 Bash 脚本中使用它,如下所示:

ssh-util <host> <port> <user> <pass> <command>
e.g.
ssh-util 10.0.0.10 22 root s3cr3t ls -la

关于linux - 使用expect通过ssh和密码传输命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30781632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com