gpt4 book ai didi

bash - 期望 ssh 无密码

转载 作者:行者123 更新时间:2023-12-02 14:04:12 26 4
gpt4 key购买 nike

我有一个包含 IP 地址、文件位置和密码的文件。我不能使用 ssh key 身份验证,这就是为什么我只能在 bash 脚本中使用期望。该文件包含以下信息,以空格分隔:

ip位置密码

ip位置密码

ETC

我的脚本是:

 VAR=$(expect -c "
set fid [open "file.conf" w]
set content [read $fid]
close $fid
set records [split $content "\n"]
foreach rec $records {
set fields [split $rec]
lassign $fields\ ip location password
puts "$ip"
puts "$location"
puts "$password"}
spawn ssh $ip tail -f $location > /home/log_$ip 2>/dev/null &
expect {
".*Are.*.*yes.*no.*" { send "yes\n" }
"*?assword:*" { send "$password\r" }
}
")

echo “$VAR”

当我运行脚本时,它给了我这个错误:

错误 #args: 应该是“读取 channelId ?numChars?”或“阅读?-nonewline?channelId”
在执行时
“读 ”
从内部调用
“设置内容[阅读]”

最佳答案

您需要将期望主体括在单引号中,因此在期望开始执行之前,shell 不会扩展期望变量。

此外,如果您点击“是...是...否”提示,那么您需要使用 exp_continue所以你可以继续期待密码提示。

不要使用“w”打开配置文件 -- 您将销毁文件内容。你正在阅读它,所以打开它阅读

VAR=$(expect -c '
set fid [open "file.conf" r]
while {[gets $fid line] != -1} {
lassign [split $line] ip location password
puts "$ip"
puts "$location"
puts "$password"
spawn ssh $ip tail -n 20 $location > /home/log_$ip 2>/dev/null &
expect {
-re "Are.*yes.*no" { send "yes\r"; exp_continue }
-gl "*?assword:*" { send "$password\r" }
}
}
')

我不确定当您重定向 spawn 输出时这是否会起作用:我担心 expect 将无法使用。如果这不起作用,请删除“ > /home/log_$ip 2>/dev/null &”或使用
spawn ssh $ip tail -n 20 $location 2>/dev/null | tee /home/log_$ip

对于背景,您可能必须做这样的事情(未经测试)
expect -c '...' > /home/log_$ip 2>&1 &
expect_pid=$!

# ...

# later
wait $expect_pid
VAR=$(< /home/log_$ip)
do something with "$VAR"

关于bash - 期望 ssh 无密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569945/

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