원격 컴퓨터에서 PS1 프롬프트를 동적으로 설정하려고 합니다. 원격 시스템에 SSH로 접속할 때 해당 원격 시스템의 프롬프트에 설정될 값도 전송한다는 아이디어입니다. 원격 시스템에 대한 SSH 로그인을 자동화하는 Expect 스크립트가 이미 있습니다. 이제 자동 ssh 작업을 수행하고 ssh를 통해 전달된 값으로 PS1 프롬프트를 설정하도록 스크립트를 수정하려고 합니다. 아래는 내 스크립트입니다
#!/usr/bin/expect -f
set password Mayy@029Mayy@029
# now connect using ssh
spawn ssh -t [email protected] "'export PS1='bvdev@429[\w]#'; exec bash -l"
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
interact
위 스크립트를 실행하는 동안 오류가 발생했습니다. Inavalid command name w while executing \w
.
내가 올바른 방식으로 접근하고 있는지 잘 모르겠습니다. 내 스크립트가 이 작업에 적합합니까? 도와주세요
답변1
Expect는 Tcl의 확장이므로 Tcl의 구문 규칙을 이해해야 합니다.
spawn ssh -t [email protected] "'export PS1='bvdev@429[\w]#'; exec bash -l"
큰따옴표 내에서 Tcl은 명령 대체 메커니즘으로 대괄호를 사용합니다. 또한 백슬래시의 역할은 \w
특수 문자(예: \t
is)가 아닙니다.
Tcl의 보간되지 않은 인용 메커니즘(예: 쉘의 작은따옴표), 즉 중괄호를 사용해야 합니다.
spawn ssh -t [email protected] {export PS1='bvdev@429[\w]#'; exec bash -l}
하지만, bash -l
사용자의 포인트 파일을 처리하므로 설정한 PS1 내보내기가 무시될 가능성이 높습니다.
spawn ssh -t [email protected] {
export PS1='bvdev@429[\w]#'
exec bash --noprofile --norc -i
}
그러나 (다시 한번) 나는 그렇게 하지 않을 것입니다. 로그인 후 필요한 PS1을 보내드립니다
spawn ssh -t [email protected]
expect "*?assword:*"
send -- "$password\r"
send -- "\r"
send -- {PS1='bvdev@429[\w]#'}
send -- "\r"
interact