첫째, 간단한 일을 하면 그런 일이 일어나지 않을 것입니다! 그래서 제가 모르는 또 다른 것이 그것을 변환하는 것입니다.ssh [email protected] "cat backup.tar" > backup.tar
서버에 대한 액세스 권한을 부여하지 않고 시스템의 현재 상태에 대한 백업을 제공해야 합니다. 내가 한 일은 다음과 같습니다.
- 새 사용자를 만듭니다. 그를 그렇게 부르자
username
- SSH 키를 통해서만 액세스 허용
- 열쇠를 넣어
authorized-keys
- 명령/셸을
/etc/passwd
사용자 정의 스크립트로 변경username
- 사용자 정의 스크립트는 데이터베이스 덤프를 수행하고 일부 파일을 복사하여 데이터를 얻은 다음 마지막으로 tar 아카이브를 생성합니다.
stdout
- 에 추가 출력이 없는지 확인하십시오
stdout
.
데이터를 얻으려면 다음을 수행해야 합니다.ssh [email protected] > backup.tar
이제 변경된 줄 끝을 제외하고 거의 모든 것이 잘 작동합니다. 점점 tar
더 커지면서 각 줄에는 기호로 끝나는 도스 줄이 있는 것을 볼 수 있습니다 ^M
. 바이너리 tar 파일을 강제로 생성하면 dos2unix
파일이 서버에 있는 파일과 일치합니다.
왜 이런 일이 발생하며 줄 끝이 어떻게 바뀌나요? 심지어 다음과 같이 단순화했습니다. username
링크에 대한 서버의 스크립트는 /etc/passwd
링크를 생성하고 위 명령으로 로그인하고 출력을 내 로컬 컴퓨터의 파일로 리디렉션할 때 cat .viminfo
줄 끝이 여전히 오류를 전송합니다.ssh
username
답변1
일어날 수 있는 일: ssh
명령 인수 없이(및 지정된 옵션 없이) 호출되면,RemoteCommand
의사 터미널세션은 기본적으로 원격 시스템에 할당됩니다. 이는 원격 시스템이 실행되도록 구성된 명령에 관계없이 발생합니다. 의사 터미널은 일반적으로 개행 문자를 캐리지 리턴+줄 바꿈 시퀀스( LF
→ CRLF
, 참조) 로 변환하도록 구성됩니다.이 답변자세한 설명을 위해). 따라서 스크립트의 출력은 의사 터미널 장치에 기록되고, 의사 터미널 장치는 이를 변경한 다음 클라이언트로 보냅니다.
의사 터미널 할당은 다음을 포함한 다양한 방법으로 방지할 수 있습니다.
ssh
-T
클라이언트의 옵션을 사용하여 호출됩니다(또는 의 구성 파일(아마도 )RequestTTY no
에서 사용 ).ssh
~/.ssh/config
원격 시스템에서 사용자가 입력하는 내용 앞에 추가
no-pty
(공백에 유의)하세요 .authorized_keys
PermitTTY no
원격 시스템의 SSH 서버 구성에 사용됩니다( 특정 사용자에게만 영향을 미치도록 조건부 블록을/etc/ssh/sshd_config
사용할 수도 있음 ).Match
Match User="username" ForceCommand /path/to/your/script DisableForwarding yes PermitTTY no
(사용자에 대해 작동하는 명령 셸이 설정되어 있다고 가정합니다
/etc/passwd
. 그러면 사용자의 비밀번호를 잠그고 다른 방법으로 로그인할 수 없도록 할 수 있습니다.)(귀하의 경우
ssh
명령 인수를 사용하여 호출하는 것도 작동해야 합니다(예:ssh user@host :
). 비록 이것이 해결 방법에 불과하다고 생각하지만).
물론 가장 적절한 옵션은 사용 사례, 특히 사용자 선택 허용 여부에 따라 다릅니다.
또한보십시오:
- 하나의 명령만 실행하는 UNIX 계정 만들기- 부분적인 대안의 경우 지적한 대로댓글에서귀하의 질문에 대해 사용자의 기본 인터프리터로 사용되는 스크립트는 (잠재적으로) 사용자가 쉘을 얻는 것을 방지하지만 자체적으로 악용 가능한 요소를 추가할 수도 있습니다.
답변2
ssh
Python 스크립트용 터널을 만들고 있습니다 . ssh 명령줄은 아무 작업도 수행하지 않으며 인수도 없으므로 쉘과 의사 tty를 열려고 시도합니다.
ssh로 시작한 후 subprocess.Popen
, 내 개행 문자파이썬스크립트는 줄 바꿈으로만 분할되고 캐리지 리턴은 없으므로 Python 스크립트의 출력은 끔찍해집니다. 게다가 pytest
의사 tty와 관련하여 이해할 수 없는 이유로 Python 스크립트가 실행되지 않습니다. ssh에 공급 pytest
하여 실행할 수 있지만 -tt
일반 Python stdout은 여전히 손상되었습니다. -T
해당되지 않습니다 pytest
.
ssh 명령줄에 매우 긴 sleep 명령을 입력하여 문제를 해결했습니다 ssh -L 1234:remote:1234 user@remote sleep 1000000
. 테스트를 위해 터널만 열면 되므로 시간 초과는 문제가 되지 않습니다.