【问题标题】:cat a file to remote system using Expect使用 Expect 将文件添加到远程系统
【发布时间】:2012-09-04 19:17:34
【问题描述】:

我正在尝试编写我的第一个期望脚本,它将新语言推送到远程文件。

这是我目前所拥有的,但并没有真正起作用:

#!/usr/bin/expect

set fid1 [open ./hosts.list r]
set hosts [read -nonewline $fid1]
close $fid1

set banner_cmd "cat > /tmp/new_sshd_banner << EOF


<New Language Goes Here>


EOF"
send "\n"

stty -echo
send_user "Enter password for remote sudo: "
expect_user -re "(.*)\n"
stty echo
set pass $expect_out(1,string)
send "\n"

foreach host [split $hosts "\n"] {
    eval spawn "/usr/bin/ssh $host"
    expect {
        -re "RSA key fingerprint" {send "yes\r"}
        timeout {puts "Host is known"}
    }

    expect "$host"
    send "sudo mv /etc/file /etc/file.orig"
    expect "assword"
    send $pass

    expect "$host"
    send "sudo $file_cmd"

    expect "$host"
    send "sudo mv /tmp/file /etc/file

}

当它运行时,这是我看到的:

opensuse @ 15:10 ~/bin> ./fix_file.exp 

Enter password for remote sudo: 
spawn /usr/bin/ssh server

<New Language Goes Here>


Last login: Fri Aug 31 19:52:45 2012 from 10.152.81.105
[user@server ~]$ Host is known
sudo cat > /tmp/new_file << EOF 
> 
> 
> <New Language Goes Here> 
> 
> EOFsudo mv /etc/file /etc/filePASSWORD*missing "
    while executing
"send "sudo mv /tmp/file /etc/file

"
    ("foreach" body line 17)
    invoked from within
"foreach host [split $hosts "\n"] {
    eval spawn "/usr/bin/ssh $host"
    expect {
        -re "RSA key fingerprint" {send "yes\r"}
        timeout {puts "Host i..."
    (file "./fix_file.exp" line 45)

不太明显的一件事是,它将从用户那里获得的密码附加到 mv 命令的输出中。

我哪里做错了?

【问题讨论】:

    标签: ssh tcl expect sudo cat


    【解决方案1】:

    正是错误所说的:

    missing "
        while executing
    "send "sudo mv /tmp/file /etc/file
    

    您在该行之后缺少结束的 ":

        send "sudo mv /tmp/file /etc/file
    

    【讨论】:

    • 绉纱。我怎么错过了? /掌脸
    • 现在已经修复了,我可以看到其余部分在做什么,例如将密码附加到文件名之一。它实际上只是将发送命令的参数回显到屏幕上。不幸的是,它实际上并没有执行我想要执行的操作。该语言未输入到文件中。
    • @theillien 您最好在本地创建文件并执行spawn scp $localfile ${host}:/tmp/new_sshd_banner 来传输它(根据需要处理密码)。不过,更一般地说,我会编写一个程序来执行send sudo ...,这样您就可以处理可选 密码请求,而不必每次都完整地写出来。最好只调试一次。 :-)
    • 我确实最终将文件 scp'ing 到每个服务器,现在将尝试运行 sudo 将其放置到位。我们会看看情况如何。
    • 尝试移动文件时仍然无法正常工作。它实际上登录并将我置于提示符下,而不是发送 sudo 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多