Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 除了ssh密码之外_Bash_Ssh_Expect - Fatal编程技术网

Bash 除了ssh密码之外

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"

我有一个包含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"]
        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"