이 명령을 실행하면 예상대로 출력되며 /root
내 서버의 디렉터리가 나열됩니다.
~ bash -c "ssh -t myserver 'sudo ls /root'"
Enter passphrase for key '/home/james/.ssh/ed25519':
[sudo] password for myserver:
snap
Connection to 167.172.xxx.xxx closed.
그러나 하위 쉘을 사용하여 해당 출력을 변수로 가져오려고 하면 SSH 비밀번호를 입력한 후 SSH 세션이 중단됩니다.
➜ ~ var=$(bash -c "ssh -t myserver 'sudo ls /root'")
Enter passphrase for key '/home/james/.ssh/ed25519':
그대로 유지됩니다. Enter를 다시 눌러도 새 줄이 생성되지 않으며 ctrl-C로 취소할 때까지 아무 일도 일어나지 않습니다.
서브셸에서 다르게 작동하는 이유는 무엇이며, ssh 명령의 출력을 로컬 변수로 가져오려면 어떻게 해야 합니까?
편집: @KamilMaciorowski가 지적했듯이 stderr과 stdout은 하나로 병합됩니다. (실제로 비밀번호를 입력할 수 있으며 캡처된 출력에는 비밀번호 프롬프트와 예상 출력이 포함됩니다.)
var=$(bash -c "ssh -t stash 'sudo ls /root'")
Connection to 167.172.xxx.xxx closed.
➜ ~ echo $var
[sudo] password for stash:
snap
그가 링크한 스레드는 내가 원하는 것이 불가능하다는 것을 나타내는 것 같았기 때문에 출력 문자열을 조작하는 것이 최선의 선택일 것이라고 생각했고 잘 작동했습니다.
var=$(bash -c "ssh -t stash 'sudo ls /root'" | tail -n +2)
그러나 원격 명령의 출력을 로컬 변수로 캡처하는 더 좋은 방법이 있습니까?