bash 脚本执行命令但在文件中存储不同的数据

bash 脚本执行命令但在文件中存储不同的数据

我有 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\"

相关内容