원격 서버에 연결하고 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 등). 따라서 다음과 같이 작성하면:
./scp.sh username test password
그런 다음 스크립트에 다음을 보냅니다.
expect -c " spawn scp "username@test:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"password\r\"