bashスクリプトはコマンドを実行しますが、ファイルに別のデータを保存します。

bashスクリプトはコマンドを実行しますが、ファイルに別のデータを保存します。

リモートサーバーに接続し、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つの異なる見積もりを受け取る必要があることを意味します。リストからコマンドラインパラメータにアクセスできます。expectenvtcl$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\"

関連情報