Unix AIX 传递变量和参数来期望和产生

OmA*_*mAr 5 scp aix shell-script expect

我正在编写一个脚本来scp一些文件,但需要通过用户或另一个脚本作为参数传递文件位置

#!/usr/bin/expect

set FILEPATH1 $1

spawn sh "scp $FILEPATH1 $USER@$HOST:/destination/files"
        set pass "pass123"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }
Run Code Online (Sandbox Code Playgroud)

在 spawn 和 #!/usr/bin/expect 之前也试过这个

FILEPATH1=$1
Run Code Online (Sandbox Code Playgroud)

gle*_*man 7

这不是你想要的:

set FILEPATH1 $1
Run Code Online (Sandbox Code Playgroud)

Tcl(和expect)不使用shell 风格的$1, $2, ...方式来访问命令行参数。您要使用全局$argv列表:

set FILEPATH1 [lindex $argv 0]
Run Code Online (Sandbox Code Playgroud)

此外,您的 spawn 调用不正确。sh将寻找一个文件名为“SCP的$ FILEPATH1 $ USER @ $ HOST:/目的/文件”。您不需要 shell 来生成 scp:

spawn scp $FILEPATH1 $USER@$HOST:/destination/files
Run Code Online (Sandbox Code Playgroud)

现在,USER 和 HOST 来自哪里?它们是环境变量吗?如果是这样的话:

spawn scp $FILEPATH1 $env(USER)@$env(HOST):/destination/files
Run Code Online (Sandbox Code Playgroud)

而且,您不会在脚本退出之前等待传输实际完成。做这个:

expect password:
send "$pass\r"
set timeout -1
expect eof
Run Code Online (Sandbox Code Playgroud)

我假设您只被提示输入一次密码。如果您必须多次输入它,那么

expect {
    password: {
        send "$pass\r"
        set timeout -1
        exp_continue
    }
    eof
}
Run Code Online (Sandbox Code Playgroud)