リモートサーバーに接続し、scpを使用してログファイルをローカルサーバーにコピーするbashスクリプトがあります。リモートサーバーからキーをコピーまたはインストールすることはできません。私の権利は限られています。分析するダンプログがあるので、ローカルサーバーにコピーしたいと思います。 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
で作成するのではなく、呼び出されたスクリプトで作成すると、状況がより複雑になります。これは、一致する2つの異なる見積もりを受け取る必要があることを意味します。リストからコマンドラインパラメータにアクセスできます。expect
env
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番目は$ 2など)。したがって、次のように書くと:
./scp.sh username test password
次に、スクリプトに次を送信します。
expect -c " spawn scp "username@test:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"password\r\"