sftp에 대한 비밀번호 프롬프트를 잡으려고 하는데 STDIN이나 STDERR에서 나오지 않습니다. 하위 프로세스에서 발생할 수 있습니다.
아래는 내 테스트입니다. 비밀번호 프롬프트를 파일로 리디렉션해 보았습니다. 파일 핸들 번호 1~4를 시도해 보았습니다. 그러나 성공하지 못했습니다.
mypc:/home/myname$ sftp localhost >/tmp/junk
myname@localhost's password:
mypc:/home/myname$ sftp localhost 2>/tmp/junk
myname@localhost's password:
mypc:/home/myname$ sftp localhost 3>/tmp/junk
myname@localhost's password:
mypc:/home/myname$ sftp localhost 4>/tmp/junk
myname@localhost's password:
이것은 내 운영 체제입니다.
mypc:/home/myname$ uname -a
Linux mypc 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
mypc:/home/myname$ which sftp
/usr/bin/sftp
내가 이것을 캡처해야 하는 이유는 SFTP 연결을 테스트하기 위해 Perl 스크립트를 작성하고 있기 때문입니다. 내 작업장에 Perl의 Expect 모듈을 설치하도록 허용했다면 Perl의 Expect 모듈을 사용할 수도 있었습니다.
감사해요
답변1
1. 간단한 명령으로 비밀번호 프롬프트를 캡처할 수 없는 이유는 무엇입니까?
- 프롬프트는 하위 프로세스에서 나올 수 있습니다.
- 이는 프롬프트가 사용자가 포착할 수 있는 stdout 및 stderr과 혼합되지 않도록 하기 위한 특별한 디자인일 수 있습니다.
인용하다:stdout과 stderr이 모두 리디렉션될 때 ssh가 tty로 출력하는 방법/이유는 무엇입니까?
2. 어떻게 캡쳐하나요?
Perl의 Expect 모듈을 사용할 수 있습니다. 테스트는 아래 그림과 같습니다.
myname@mypc:/mnt/c/users/myname$ perl -MExpect -e 'print ${Expect->spawn("sftp localhost")->expect(3, [qr/.+/])}[2], "\n";'
umyname@localhost's password:
myname@mypc:/mnt/c/users/myname$ perl -MExpect -e 'print ${Expect->spawn("sftp localhost")->expect(3, [qr/.+/])}[2], "\n";' >/tmp/junk
이것은 기본적으로 tty에서 stdout까지 모든 것을 그룹화합니다.