"expect"가 비밀번호의 $(달러 기호)를 무시하도록 만드는 방법은 무엇입니까?

"expect"가 비밀번호의 $(달러 기호)를 무시하도록 만드는 방법은 무엇입니까?

스크립트 를 실행 중이고 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')

관련 정보