용어는 모르지만 기본적으로 우리 회사 환경은 점프 호스트를 사용하여 설정하기 때문에 SSH 터널을 만드는 속도가 매우 느립니다. 그래서 저는 단일 SSH 명령으로 다음 세 단계를 수행할 수 있는 방법이 있기를 바랐습니다.
$ scp localfile.jar user@server:~/path/ # upload executable
$ ssh user@server java -jar path/localfile.jar some argument >path/output.bin # run it
$ scp user@server:~/path/output.bin . # download output
그게 다야. 어떤 방법이 있나요? (서버는 내 로컬 컴퓨터에 액세스할 수 없지만 아마도 그럴 것 같습니다.) 감사합니다!
답변1
특별히 비활성화하지 않는 한 멀티플렉싱을 시도해 볼 수 있습니다. 이것은 여전히 몇 가지 명령이지만 인증을 위해 초기 기본 연결만 사용하고 나머지 명령은 사전 인증된 채널에서 실행되므로 더 빠르게 실행됩니다.
# Set up master connection to target system
ssh -S "$HOME/.ssh.sock" -M -o ControlPersist=yes -fN user@server
# Perform the commands using the master connection
scp -o ControlPath="$HOME/.ssh.sock" localfile.jar user@server:path/
ssh -S "$HOME/.ssh.sock" user@server java -jar path/localfile.jar some argument >path/output.bin
# Tear down the master connection when you have finished
ssh -S "$HOME/.ssh.sock" -O exit user@server
명령 이 ssh
이미 출력을현지의문서 path/output.bin
.
사용을 중지하고 닫는 것을 잊어버린 경우 기본 세션이 자동으로 종료되도록(예: 1분 제한 시간 ControlPersist=60
대신 ) 기본 세션에 대한 시간 제한을 지정할 수 있습니다.ControlPersist=yes
~/.ssh/ssh_config
이러한 작업을 자주 수행하는 경우 대상의 기본 설정을 다시 정의하는 것이 좋습니다 server
.
답변2
어디인지 잘 모르겠음점프 호스트그림에 빠져들지만 다음 3가지 명령을 사용하여 수행할 수 있습니다.
< localfile.jar gzip -3 |
ssh user@server '
gunzip > path/localfile.jar &&
java -jar path/localfile.jar some argument | gzip -3
' | gunzip > output.bin
localfile.jar
stdin 으로 압축되어 원격 ssh
쉘의 stdin으로 전달되고 결국 gunzip
원격 파일로 덤프됩니다.
마찬가지로 의 출력은 java
stdout에서 압축되어 전송되고 로컬에 저장하기 위해 즉시 압축이 풀립니다 output.bin
.
답변3
쉿 + 기대된다
세 가지 명령을 모두 사용하여 스크립트를 작성합니다
sh
. 여전히 비밀번호를 세 번 입력해야 하지만 수동 명령보다 여전히 쉽습니다.스크립트가 있으면 이를 사용
expect
하고 비밀번호를 채울 수 있습니다. 하지만expect
스크립트에 비밀번호를 공개적으로 저장해야 하므로 이는 안전하지 않은 것으로 간주될 수 있습니다 .
개인적으로 저는 종종 첫 번째 해결 방법에서 멈추곤 합니다. 비밀번호를 여러 번 입력하는 것은 어렵지 않습니다(단지 귀찮을 뿐입니다). 하지만 보안 환경이 허락한다면 expect
기적은 이루어질 수 있습니다.