사용자의 기본 쉘이 무엇이든 SSH가 원격 엔드에서 특정 쉘을 사용하도록 할 수있는 방법이 있습니까?
나는 비슷한 솔루션을 시도했다.
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
그러나 불행히도 원격 엔드의 기본 쉘은 "복잡한 여러 줄 명령"부분을 구문 분석하는 책임이 있으며 Bash 및 C 쉘 사용자 모두를 위해 충분히 탈출하기가 어렵습니다.
사용자의 기본 쉘이 무엇이든 SSH가 원격 엔드에서 특정 쉘을 사용하도록 할 수있는 방법이 있습니까?
나는 비슷한 솔루션을 시도했다.
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
그러나 불행히도 원격 엔드의 기본 쉘은 "복잡한 여러 줄 명령"부분을 구문 분석하는 책임이 있으며 Bash 및 C 쉘 사용자 모두를 위해 충분히 탈출하기가 어렵습니다.
답변:
적어도 openssh 기반 시스템에서는 이것이 가능하지 않다고 생각합니다. 당신이 능력이 있다면, 더 나은 해결책은 쉘 스크립트 파일을 sftp하고 나서 게시 한 방법으로 실행하는 것입니다. 필요한 이스케이프 양을 최소화 할 수 있다는 장점이 있지만 파일을 제거해야 할 파일을 남겨 두어야합니다 (아마도 스크립트의 마지막 단계).
heredoc을 사용하십시오.
ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. 그래서 그 대신 한 단계의 두 단계를 : 1 단계는 파일, 2 단계로 스크립트를 복사 cat
하는 스크립트 ssh
.
비밀번호 기반이 아닌 키 기반 로그인을 사용하십시오. 그런 다음 서버에 설치되어있는 공개 SSH 키 ( SSH1의 경우 "옵션" 필드 )에 "강제 명령" 목록을 추가 할 수 있습니다 ( SSH1의 ~ / .ssh / authorized_keys 파일) , ~ / .ssh2 / SSH2에 대한 권한 부여 ).
원하는 쉘이 호출되도록 강제 명령을 작성하십시오 ...
추가 : 최대 하나의 강제 명령을 주어진 키에 연결할 수 있습니다. 다른 목적으로 여러 개의 강제 명령이 필요한 경우 다른 키를 설정해야합니다. (물론 강제 명령을 통해 호출하는 여러 스크립트를 하나의 스크립트에 넣을 수 있습니다. 그러나 사용자가 로그인 할 경우 다른 명령을 요청했는지에 관계없이 지정된 계정 / 키에 대해 강제 명령이 항상 실행 된다는 점에 유의 하십시오. 요청 된 원래 명령을 계속 지키려면 $SSH_ORIGINAL_COMMAND
변수 를 악용하는 방법을 살펴보십시오 ...)
Google을 통해 "강제 명령"에 대해 읽어보십시오 .
/etc/sshrc
.
이 -t
옵션을 사용 하면 표준 쉘을 실행하는 것처럼 시작하려는 프로그램에 대한 의사 -tty를 강제로 할당 할 수 있습니다 . 그런 다음 원하는 쉘을 일반 오래된 인수로 전달하십시오.
이 기술을 사용하면 설치된 모든 셸을 사용할 수있을뿐만 아니라 단일 명령에서 vim 및 TTY가 필요한 다른 프로그램을 열 수도 있습니다. 어딘가에 로그인하여 vim 또는 htop 또는 다른 곳에서 파일을 여는 쉘 스크립트를 작성하는 경우 좋습니다.
me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $
이것이 로그인 쉘인지 확실하지 않지만 bash가 로그인 쉘처럼 작동하도록하는 옵션이 있으므로 쉘도 마찬가지입니다.
놀랍게도 다음과 같은 결과가 나타납니다.
대시로 실행 :
ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"
sh: 1: Syntax error: "(" unexpected
대 배쉬 :
ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'
/dev/fd/63
완전히 인용 된 명령을 표시하면 예상대로 작동합니다.
sh -c "$*"
. 따라서, 당신은 실행 중입니다 sh -c "/bin/bash -c echo <(cat)"
; echo
명령 자체에 전달되는 유일한 인수 -c
하고는 <(cat)
모두 별도의 인수입니다.
나는 비슷한 상황에 잠시 동안 sqlplus에 ksh coprocess를 사용해야했고 읽기와 쓰기가 이루어져야하는 ssh 만있었습니다.
이를 수행하는 방법은 모든 종속 명령을 원격 시스템의 / usr / bin / ksh에 한 줄로 사용 (; 사용)하는 것입니다. 예를 들면 다음과 같습니다.
host="user@host"
db_conn="ora_user/passwd"
a="select * from dual;"
frmt="set heading off echo off feedback off verify off pagesize 0 termout off"
var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")