명령에 여러 명령이 포함될 것으로 예상됩니다.

명령에 여러 명령이 포함될 것으로 예상됩니다.

원격 서버 [authorized_keys...]에 문제가 있으므로 expect명령을 사용하여 서버에 SSH를 통해 연결하는 스크립트를 로컬 컴퓨터에 작성한 다음 cd실행합니다 .git pull

하지만 나는 이것을 작동시킬 수 없습니다 :

#!/usr/bin/expect
spawn ssh USER@IP_ADDRESS   
expect {
    "USER@IP_ADDRESS's password:"  {
        send "PASSWORD\r"
    }
    "[USER@server ~]$" {
        send "cd public_html"
    }
}   
interact

일부 문자를 이스케이프 처리해야 합니까? 시도하더라도 여전히 cd명령을 무시합니다.

답변1

[TCL에 특별하므로 "\[quotes]"따옴표를 중괄호로 전달하거나 대체하여 적절한 처리가 필요합니다 {[quotes]}. 더 완전한 예는 다음과 같습니다

#!/usr/bin/env expect

set prompt {\[USER@HOST[[:blank:]]+[^\]]+\]\$ }
spawn ssh USER@HOST

expect_before {
    # TODO possibly with logging, or via `log_file` (see expect(1))
    timeout { exit 1 }
    eof { exit 1 }
}

# connect
expect {
    # if get a prompt then public key auth probably logged us in
    # so drop out of this block
    -re $prompt {}
    -ex "password:" {
        send -- "Hunter2\r"
        expect -re $prompt
    }
    # TODO handle other cases like fingerprint mismatch here...
}

# assuming the above got us to a prompt...
send -- "cd FIXMESOMEDIR\r"

expect {
    # TWEAK error message may vary depending on shell (try
    # both a not-exist dir and a chmod 000 dir)
    -ex " cd: " { exit 1 }
    -re $prompt {}
}

# assuming the above got us to a prompt and that the cd was
# properly checked for errors...
send -- "echo git pull FIXMEREMOVEDEBUGECHO\r"

expect -re $prompt
interact

관련 정보