스크립트 를 실행 중이고 expect
비밀번호에 한 $
문자가 있습니다. 쉘은 다음 문자를 찾아 무언가로 확장하고 이를 내보냅니다 no such variable
.
이 문제를 해결할 방법이 있나요?
답변1
두 가지 방법이 있습니다. 모든 특수 문자를 백슬래시하거나 비밀번호 주위에 중괄호를 사용하는 것입니다.
expect1.1> set pass "\$Hunter2"
$Hunter2
expect1.2> set pass {$Hunter2}
$Hunter2
삼! 세 가지 방법: 파일에서 비밀번호를 읽습니다 thepasswordfile
. 이 방법의 장점은 비밀번호가 코드에 없다는 것입니다.
#!/usr/bin/env expect
# wrap with catch(n) or try(n) if you don't want an error to abort
# the code...
set fh [open thepasswordfile]
set password [gets $fh]
puts $password
4. 표준 출력에서 비밀번호를 생성하는 프로그램에서 비밀번호를 수집합니다.
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
이는 다음과 같을 수 있습니다:
$ cat fromstdin
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
$ cat getthepassword
#!/bin/sh
echo '$Hunter2'
$ chmod +x fromstdin getthepassword
$ ./fromstdin
$Hunter2
$
다섯! 환경에서 비밀번호를 읽는 5가지 방법( environ(7)
, tclvars(n)
)
#!/usr/bin/env expect
set password $env(pass)
puts $password
export pass='$Hunter2'
이 구현을 호출하기 전에 상위 프로세스에서 동등한 작업이 완료되었다고 가정합니다 . 단점: 환경 변수는 비밀번호를 보기 위해 권한이 필요할 수도 있고 필요하지 않을 수도 있는 모든 하위 프로세스에 전달됩니다. 의심스러운 경우 변수를 사용하거나 복사한 후 변수를 설정 해제하세요.
#!/usr/bin/env expect
set password $env(pass)
unset env(pass)
...
답변2
$
비슷한 문제가 있었는데 예상 스크립트에 fileName을 전달하고 싶었는데 다음이 나에게 효과적이었습니다.
filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g')