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 등). 따라서 다음과 같이 작성하면:

./scp.sh username test password

그런 다음 스크립트에 다음을 보냅니다.

expect -c " spawn scp "username@test:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"password\r\"

관련 정보