我有 bash 脚本,它连接到远程服务器并使用 scp 将日志文件复制到本地服务器。在远程服务器上,我无法复制密钥或安装。我的权利有限。我有一些需要分析的转储日志,因此我想将它们复制到本地服务器上。这有点棘手,因为我使用 Expect 命令作为密码。这个脚本叫做scp.sh它看起来像:
#!/bin/bash
expect -c "
spawn scp "[email protected]:~/path/dir/some.log" /home/some.log
expect \"Password\"
send \"password\r\"
interact .
现在我有 2 个服务器(TEST 和 LIVE)和 2 个用户,我想像这样执行: ./scp.sh TEST 或 ./scp.sh LIVE
答案1
bash
通过将其编写为调用的脚本expect
而不是将其编写为expect
脚本(甚至是env
脚本),您会使事情变得更加复杂。这意味着您需要获得2种不同的报价方案来配合。您可以tcl
通过列表访问命令行参数$argv
#!/usr/bin/env expect
set arg1 [lindex $argv 0]
if {$arg1 == "TEST"} {
set user "xxx"
set host "host1"
set pass "testpass"
} elseif {$arg1 == "LIVE"} {
set user "yyy"
set host "host2"
set pass "livepass"
} else {
send_user "First parameter is not TEST or LIVE"
exit 1
}
spawn scp "$user@$host:~/path/dir/some.log" /home/some.log
expect "yes/no)? " {send "yes\r" ; exp_continue} "Password"
send "$pass\r"
在脚本中包含密码并不是很好,但可能比在命令行上传递密码更好。
答案2
因此,在执行以下操作时,您必须传递主机名、用户和密码作为参数scp
:
expect -c " spawn scp "$1@$2:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"$3\r\"
1 美元表示脚本执行后输入的第一个参数($2 第二个,依此类推),因此如果您编写:
./scp.sh username test password
然后您将发送到您的脚本:
expect -c " spawn scp "username@test:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"password\r\"