2016-11-09 1 views
0

expect 스크립트를 사용하여 원격 서버에 명령을 보내려고하는데 문제가 있습니다. 스크립트에서 명령을 send 명령에 수동으로 삽입하면 명령이 Ok가되지만 인수 ($ 명령)를 통해 예외 스크립트에 전달하면 명령이 작동하지 않습니다. 원격 서버에서 실행하려는 명령은 다음과 같습니다.파이프 및 특수 문자가 작동하지 않는 명령 변수가 필요합니다.

top -b -n 2 | 헤드 -15 & & ls -lrt/var/log | 머리 -10

예 : ./myexpectscript 암호 IP "최고 -b -n 2 | 머리 -15 &"

업데이트 : 내가 보내는 모든 명령 (즉, 하나 이상의 것을 알아 원격 서버에서이 스크립트를 통해 문자열) 예를 들어 ... 중괄호 내에서 실행됩니다

./myexpectscript 암호 IP "PWD는"

./myexpectscript 암호 IP "에코 안녕하세요"대답은 괜찮습니다 :

나는 따옴표 명령 작품을 제거하면
# {echo hello} 
/bin/sh: {echo: not found 

:

./myexpectscript 비밀번호 IP 에코 인사를

# echo hello 
hello 

그래서, 문제는 배수 한 줄 명령을 파이프 실행하고자하는 것입니다 : 내 스크립트를 제외한 통해 서버에

top -b -n 2 | head -15 && ls -lrt /var/log | head -10 

내가 가지고 :

# {top -b -n 2 | head -15 && ls -lrt /var/log | head -10} 
    /bin/sh: {top: not found 
    ls: /var/log: No such file or directory 
    head: invalid number '10}' 

큰 따옴표로 작동해야하지만 중괄호로 명령이 있습니다. 다른 유형의 다른 서버에서이 스크립트를 시도했지만 동일한 문제가 발생했습니다.

#!/usr/bin/expect -f 
set password [lrange $argv 0 0] 
set ipaddr [lrange $argv 1 1] 
set command [lrange $argv 2 end] 
set timeout -1 
spawn ssh [email protected]$ipaddr 
match_max 100000 
expect "*?assword:*" 

send -- "$password\r" 

expect "*\\\[0-7\\\]:*" 
send -- "5\r" 

expect "*\\\[0-4\\\]:*" 
send -- "3\r" 

expect "\\\#*" 

#spawn {*}$command 
#eval spawn $command 
#send -- "$command\r" 
send -- "top -b -n 2 | head -15 && ls -lrt /var/tslog | head -10\r" 

expect "\\\#*" 
send -- "exit\r" 

expect "*\\\[0-4\\\]:*" 
send -- "0\r" 

expect "*\\\[0-7\\\]:*" 
send -- "0\r" 


expect eof 
+0

당신이 기대하는 스크립트 –

답변

0

사용 lindex 대신 lrange :

#!/usr/bin/expect -f 
set password [lindex $argv 0] 
set ipaddr [lindex $argv 1] 
set command [lindex $argv 2] 
... ... 
send -- "$command\r" 

그리고 스크립트이 방법으로 호출

./myexpectscript password ip "echo hello world" 
+0

I에 인수로 명령을 제공하는 방법을 정확하게 보여를 메인 포스트를 업데이트했습니다. 지금은 더 많은 클리트가 있기를 바랍니다. 답변을 주셔서 감사합니다. 이미 성공없이 큰 따옴표로 전달하려고했습니다. – SimoneM

+0

그게 다야! 고맙습니다. – SimoneM

관련 문제