SSH가 특정 쉘을 사용하도록 강제


29

사용자의 기본 쉘이 무엇이든 SSH가 원격 엔드에서 특정 쉘을 사용하도록 할 수있는 방법이 있습니까?

나는 비슷한 솔루션을 시도했다.

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

그러나 불행히도 원격 엔드의 기본 쉘은 "복잡한 여러 줄 명령"부분을 구문 분석하는 책임이 있으며 Bash 및 C 쉘 사용자 모두를 위해 충분히 탈출하기가 어렵습니다.


답변:


8

적어도 openssh 기반 시스템에서는 이것이 가능하지 않다고 생각합니다. 당신이 능력이 있다면, 더 나은 해결책은 쉘 스크립트 파일을 sftp하고 나서 게시 한 방법으로 실행하는 것입니다. 필요한 이스케이프 양을 최소화 할 수 있다는 장점이 있지만 파일을 제거해야 할 파일을 남겨 두어야합니다 (아마도 스크립트의 마지막 단계).


1
이것이 내가 결국 한 일이지만 scp를 사용합니다. 좋은 생각입니다.
plinehan

16

heredoc을 사용하십시오.

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

bash가 stdin에서 명령을 읽을 때 "-s"를 사용해서는 안됩니까?
Weboide

항상 필요한 것은 아닙니다.
이그나시오 바스케스-아 브람스

명령이 stdin에 액세스하지 못하게하고 특정 쉘을 호출하는 것에 대한 질문이 있었기 때문에 가능하면 투표를 거부합니다.
Eric Woodruff

3
@EricWoodruff, ... 특정 쉘 (이 경우에는 bash)을 호출하는 방법이 바로 그 방법입니다.
Charles Duffy

1
참고로하실 수도 있습니다 cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. 그래서 그 대신 한 단계의 두 단계를 : 1 단계는 파일, 2 단계로 스크립트를 복사 cat하는 스크립트 ssh.
Trevor Boyd Smith

10

비밀번호 기반이 아닌 키 기반 로그인을 사용하십시오. 그런 다음 서버에 설치되어있는 공개 SSH 키 ( SSH1의 경우 "옵션" 필드 )에 "강제 명령" 목록을 추가 할 수 있습니다 ( SSH1의 ~ / .ssh / authorized_keys 파일) , ~ / .ssh2 / SSH2에 대한 권한 부여 ).

원하는 쉘이 호출되도록 강제 명령을 작성하십시오 ...

추가 : 최대 하나의 강제 명령을 주어진 키에 연결할 수 있습니다. 다른 목적으로 여러 개의 강제 명령이 필요한 경우 다른 키를 설정해야합니다. (물론 강제 명령을 통해 호출하는 여러 스크립트를 하나의 스크립트에 넣을 수 있습니다. 그러나 사용자가 로그인 할 경우 다른 명령을 요청했는지에 관계없이 지정된 계정 / 키에 대해 강제 명령이 항상 실행 된다는 점에 유의 하십시오. 요청 된 원래 명령을 계속 지키려면 $SSH_ORIGINAL_COMMAND변수 를 악용하는 방법을 살펴보십시오 ...)

Google을 통해 "강제 명령"에 대해 읽어보십시오 .


좋은 물건. O'Reilly 페이지의 그래픽은 매우 좋습니다. 그러나 필자의 경우에는 키를 올바르게 설정 한 사용자뿐만 아니라 모든 사용자에게 강제로 적용하고 싶습니다. 또한 서버 시스템에 루트가 없으므로와 같은 파일을 편집 할 수 없습니다 /etc/sshrc.
plinehan

글쎄, 항상 서비스에 연결할 때 샷을 호출하는 서버 (또는 더 나은 : 서버를 제어하는 ​​서버)입니다. -사용자보다 높은 권한이없는 경우 '모든 사용자'에게 어떤 것도 강요 할 수 없습니다.
커트 파이 플

클라이언트가 임의의 명령을 실행할 수 있으면 클라이언트도 임의의 쉘을 명령으로 실행할 수 있습니다.
Eric Woodruff

O'Reilly로 연결되는 @KurtPfeifle이 고장났습니다
Brian Vandenberg

@BrianVandenberg : 힌트를위한 Thx. 나는 지금 그 링크를 제거했다.
Kurt Pfeifle

2

-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가 로그인 쉘처럼 작동하도록하는 옵션이 있으므로 쉘도 마찬가지입니다.


1

놀랍게도 다음과 같은 결과가 나타납니다.

대시로 실행 :

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

완전히 인용 된 명령을 표시하면 예상대로 작동합니다.


1
전혀 놀라운 일이 아닙니다. 원격 ssh 데몬이 효과적으로 실행됩니다 sh -c "$*". 따라서, 당신은 실행 중입니다 sh -c "/bin/bash -c echo <(cat)"; echo명령 자체에 전달되는 유일한 인수 -c하고는 <(cat)모두 별도의 인수입니다.
Charles Duffy

0

나는 비슷한 상황에 잠시 동안 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.