Expect 명령에서 sed를 사용할 때 백슬래시를 피하는 올바른 방법은 무엇입니까?

Expect 명령에서 sed를 사용할 때 백슬래시를 피하는 올바른 방법은 무엇입니까?

현재 다음과 같은 자동화된 SSH 스크립트 코드가 있습니다.

#!/usr/bin/expect -f

set pw "mypass"
spawn ssh [email protected]

expect "Password:"
send "$pw\r"

expect "Verification code:"
send "/usr/local/bin/authtool --totp --base32 $(sed -n '/^secret=/s///p' ~/.Auth.sc)\r"

기본적으로 2단계 로그인 프로세스가 있습니다. 첫 번째는 비밀번호(작동함)이고, 두 번째는 인증(작동하지 않음)입니다.

sed 부분에 도달할 때마다 다음이 반환됩니다.

can't read "(sed -n '/^secret=/s///p' ~/.Auth.sc)": no such variable
    while executing

어떻게 해야할지 모르겠지만 백슬래시와 이스케이프 처리와 관련이 있는 것으로 의심됩니다. 나는 올바른 길을 가고 있습니까?

답변1

in 은 Tcl동일 [...]하므로 $(...)코드를 다음과 같이 작성해야 합니다.

send "/usr/local/bin/authtool --totp --base32 [exec sed -n '/^secret=/s///p' $::env(HOME)/.Auth.sc]\r"

답변2

이 시도,

기본적으로 expect스크립트의 코드 부분은 다음과 같습니다.

send "/usr/local/bin/authtool --totp --base32 $(sed -n '/^secret=/s///p' ~/.Auth.sc)\r"

예상되는 변수로 취급되지만 $(sed -n '/^secret=/s///p' ~/.Auth.sc)실제로는 그렇지 않습니다.

그러니 이것을 시도해 보세요. 즉, 탈출하세요.$ ( )

send "/usr/local/bin/authtool --totp --base32 \$\(sed -n '/^secret=/s///p' ~/.Auth.sc\)\r"

아니면 백틱을 사용해 보세요.

send "/usr/local/bin/authtool --totp --base32 `sed -n '/^secret=/s///p' ~/.Auth.sc`\r"

관련 정보