![Expect 명령에서 sed를 사용할 때 백슬래시를 피하는 올바른 방법은 무엇입니까?](https://linux55.com/image/11868/Expect%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EB%B0%B1%EC%8A%AC%EB%9E%98%EC%8B%9C%EB%A5%BC%20%ED%94%BC%ED%95%98%EB%8A%94%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
현재 다음과 같은 자동화된 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"