Bash 除了ssh密码之外
我有一个包含ip地址、文件位置和密码的文件。我不能使用ssh密钥身份验证,这就是为什么我只能在bash脚本中使用expect。该文件包含以下信息,以空格分隔: ip位置密码 ip位置密码 等 我的剧本是:Bash 除了ssh密码之外,bash,ssh,expect,Bash,Ssh,Expect,我有一个包含ip地址、文件位置和密码的文件。我不能使用ssh密钥身份验证,这就是为什么我只能在bash脚本中使用expect。该文件包含以下信息,以空格分隔: ip位置密码 ip位置密码 等 我的剧本是: VAR=$(expect -c " set fid [open "file.conf" w] set content [read $fid] close $fid set records [split $content "\n"
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" }
}
")
回显“$VAR”
当我运行脚本时,会出现以下错误:
错误#args:应该是“读取channelId?numChars?”或“读取?-非脱机?channelId”
执行时
“读”
从内部调用
“设置内容[读取]”您需要将expect正文括在单引号中,以便在expect开始执行之前,外壳不会展开expect变量 此外,如果您点击“are…yes…no”提示,则需要使用
exp\u continue
,这样您就可以继续等待密码提示
不要用“w”打开CONF文件——您将销毁文件内容。你正在阅读它,所以打开它阅读
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\u$ip2>/dev/null&
”或使用
对于背景,您可能必须这样做(未经测试)
expect-c'…'>/home/log_$ip 2>&1&
期望_pid=$!
# ...
#后来
等待$expect\u pid
VAR=$(
这看起来不错,我实际上使用的是tail-f,我希望它在后台运行,所以我在您的行spawn ssh$ip tail-f$location 2>/dev/null | tee/home/log| ip中添加了—,但它不起作用。如果我能在后台运行命令,您的答案非常有用。您可以在后台启动整个expect程序,但是$VAR不会捕获任何内容。我需要$VAR,因为我正在运行一个bash脚本中的expect。如果在后台启动它,您必须重定向到一个文件,因为您将无法捕获变量中的输出。然后你必须等待后台进程完成后才能读取文件。有人能帮我在后台运行tail-f吗
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"