oneliner에서 she-bang을 사용할 수 있습니까?
이 스크립트를 다음에서 실행하려고 합니다.https://stackoverflow.com/questions/16928004/how-to-enter-ssh-password-using-bash, 하나의 라이너로.
파일에 넣고 ./file을 사용하여 실행하면 예상대로 작동하지만 어떻게 원라이너로 실행할 수 있나요?
이것은 아무런 문제 없이 스크립트로 작동합니다.
#!/usr/bin/expect -f
spawn ssh [email protected]
expect "assword:"
send "mypassword\r"
interact
oneliner에서 어떻게 실행할 수 있나요?
내가 달리려고 하면
spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact
다음을 반환합니다.
bash: spawn: command not found
내가 달리려고 하면
#!/usr/bin/expect -f; spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact
그러면 모든 것이 주석으로 처리되고 아무 일도 일어나지 않습니다.
편집하다:
답변에서 제안된 내용을 실행해 보세요.
expect -c `spawn ssh user@server "ls -lh /some/file"; expect "assword:"; send "mypassword\r"; interact`
돌아왔다
bash: spawn: command not found
couldn't read file "assword:": no such file or directory
bash: send: command not found
bash: interact: command not found
expect: option requires an argument -- c
실행 시간:
$ cat << 'EOF' | /usr/bin/expect -
> spawn ssh user@server "ls -lh file"
> expect "assword:"
> send "password\r"
> interact
> EOF
SSH를 통해 서버에 연결하는 것 같지만 명령을 실행하지 않거나 결과를 출력하지 않습니다.
다음을 반환합니다.
spawn ssh user@server ls -lh file
user@server password
스크립트에서 실행할 때:
./test
spawn ssh user@server ls -lh file
user@server's password:
-rw-rw-r-- 1 user user 467G Jan 2 00:46 /file
편집 2:
첫 번째 명령의 문제점은 작은따옴표 대신 백틱을 사용하는 것입니다. 다음 명령은 예상대로 작동합니다.
expect -c 'spawn ssh user@server "ls -lh file"; expect "assword:"; send "mypassword\r"; interact'
:
답변1
문장으로서 스크립트를 매개변수로 전달할 수 있습니다.expect -c
expect -c 'spawn ssh [email protected]; expect "assword:"; send "mypassword\r"; interact'
셸의 따옴표는 '...'및 이고 "...", 예상에 대한 해당 따옴표는 {...}및 "..."이므로 셸 변수 등을 전달하는 데 어느 정도 유연성이 있습니다.
그러나 이는 금방 읽을 수 없고 유지 관리할 수 없게 됩니다.
답변2
expect
해당 스크립트는 표준 입력에서 읽을 수 있습니다.
cat << 'EOF' | /usr/bin/expect -
spawn ssh [email protected]
expect "assword:"
send "mypassword\r"
interact
EOF