다음을 통해 파일을 전송해야 ssh
하지만 불행히도 내가 연결된 호스트는 컴퓨터에 연결된 개인 슈퍼컴퓨팅 네트워크에서만 사용할 수 있는 다른 노드로 나를 리디렉션하는 "게이트" 노드일 뿐이므로 scp
이는 불가능합니다. sftp
비밀번호를 두 번 입력해야 합니다.) 따라서 게이트 노드에서는 어떤 명령도 실행할 수 없습니다.
SSH 연결의 출력(터미널) 스트림을 사용하여 파일을 전송하는 일부 도구를 사용할 수 있는지 궁금합니다.
유일한 옵션은 파일을 편리한 형식(예: base64)으로 출력하고 클립보드에 복사한 후 로컬로 디코딩하는 것입니다(또는 그 반대로).
vim을 원격으로 사용하는 것에 좌절감을 느끼기 시작했습니다. 제가 구현하고 싶은 것은 프로그램의 소스 코드를 로컬에서 편집한 다음 원격으로 테스트하는 rsync와 같은 시스템이지만, 보시다시피 그렇게 쉽지는 않습니다.
아마도 저만 이 문제를 겪고 있는 것은 아닐 것입니다. 따라서 이 목적을 위한 도구가 있어야 겠죠? (FUSE를 사용하는 솔루션이 가장 좋지만 이것이 너무 많은 것을 요구할 수도 있다는 것을 알고 있습니다.)
답변1
답변을 드리고 싶지는 않지만 댓글창이 점점 커지고 SE에서 대화창을 채팅창으로 옮기라는 알림을 받게 됩니다.
따라서 enter
몇 번 클릭하고 ~?
공백을 입력하지 마십시오. 아무것도 아님.
다음과 같은(또는 정확히 이와 같은) 내용이 표시됩니다.
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
지금 입력하면 프롬프트가 ~C
표시됩니다 . ssh>
이때 입장하세요
ssh> !scp /path/to/some/file/on/your/local/machine user@remoteserver
이미 인증되었으므로 기존 연결을 통해 파일을 전송해야 합니다.
답변2
작업을 얼마나 자동화하려는지에 따라 expect
인간처럼 SSH 세션에 데이터를 "공급"하여 배스천 호스트를 통해 내부 시스템에 데이터를 전달하도록 선택할 수 있지만 훨씬 더 빠릅니다.
#!/usr/bin/env expect
if {[llength $argv] == 0} {
puts stderr "Usage: $argv0 bastion internalhost localfile"
exit 1
}
set basthost [lindex $argv 0]
set desthost [lindex $argv 1]
set fileup [lindex $argv 2]
spawn ssh -a -e none -o ClearAllForwardings=yes -x $basthost
# TODO login foo here for bastion host, e.g. send the password
# if see that prompt
expect {
# TODO handle timeout, eof, etc.
# TODO I have no idea what your ncurses interface looks
# like, though there's doubtless something that could
# be matched and the appropriate input sent to it...
-ex "$ " {
send -- "ssh $desthost\r"
# TODO handle subsequent login to the internal host here
}
}
그런 다음 (적절한 명령문을 통해) 대상 호스트에 편집기나 다른 항목이 열려 있으면 다음을 send
통해 데이터를 공급할 수 있습니다.
set upfd [open $fileup]
while {[gets $upfd line] >= 0} {
send -- "$line\r"
}
그런 다음 더 많은 send
호출을 사용하여 파일 저장, 종료 등을 수행합니다. 오류 처리 등도 있습니다.
답변3
첫 번째는 "도어" 또는 박스 점프를 통과하도록 콘솔을 설정하는 구성입니다. 당신은 ~/.ssh/config
다음과 같이 보일 것입니다 :
Host door
Hostname door.example.com
User username_on_door
# ...
Host target
Hostname tagret.example.com
User user_on_target
# ...
ProxyCommand ssh -W %h:%p door
그런 다음 다음 명령 하나를 사용하여 대상 시스템에 직접 연결할 수 있습니다.ssh target
그런 다음 단일 명령을 사용하여 파일을 앞뒤로 전송할 수도 있습니다.
ssh taget "tar czpf - /some/important/data" | tar xzpf - -C /new/root/directory
tar cpf - /some/important/data | ssh target "tar xpf - -C /some/directory/"
sshfs
호스트를 시작해도 됩니다 .
sshfs target:/dir/ /mnt/target
너무 복잡하지 않습니까?
답변4
SCP2는 로컬 컴퓨터에서 원격 컴퓨터로 이동하는 방법인 것 같습니다. 하지만 나는 쉽게 다른 길로 갈 수도 있었습니다.
- 끌어오고 싶은 폴더를 리모콘에 보관해두었어요
그리고 그랬어tar cvf folder folder.tar
base64 folder.tar
- 텍스트 출력을 복사하여 로컬 컴퓨터의 파일에 붙여넣습니다
folder.tar.txt
. - 디코딩용
그런 다음 다음 명령을 사용하여 tar를 추출하십시오.base64 -d folder.tar.txt > folder.tar
tar xvf folder.tar