scp 命令与 Expect 实用程序一起使用时的行为有所不同

scp 命令与 Expect 实用程序一起使用时的行为有所不同
expect -c 'spawn scp -C -o CompressionLevel=9 ~/partFiles/* [email protected]:/export/home/abc/; sleep 10; expect password; send "secretPassword\n";interact'

抛出 -~/partFiles/*: No such file or directory

只是

scp -C -o CompressionLevel=9 ~/partFiles/* [email protected]:/export/home/abc/

然而,工作完美。

为什么?如何解决这个问题?

答案1

我认为~*是由 shell 扩展的,但我敢打赌,expect 会scp直接调用,绕过 shell,这样它们就不会被扩展。您可以尝试生成sh -c命令scp

如果这是一个选项,那么与服务器共享您的密钥也可能会更容易,因此您根本不需要对此有任何期望。

使用该sh技术,命令最终将如下所示:

expect -c 'spawn sh -c "scp -C -o CompressionLevel=9 ~/partFiles/* [email protected]:/export/home/abc/"; sleep 10; expect password; send "secretPassword\n";interact'

答案2

Eric 的好答案的替代方案:Tcl 可以进行全局扩展

expect <<'END_EXPECT'
    set timeout -1      # use this instead of sleep
    set files [glob -nocomplain ~/partFiles/*]
    if {[llength $files]} {
        spawn scp -C -o CompressionLevel=9 {*}$files [email protected]:/export/home/abc/
        expect password
        send "secretPassword\r"
        expect eof
    }
END_EXPECT

相关内容