ssh를 극복하는 적절한 방법


150

sudo를 사용하여 원격 서버에서 SSH를 통해 다른 스크립트를 실행하는 스크립트가 있습니다. 그러나 암호를 입력하면 터미널에 표시됩니다. (그렇지 않으면 잘 작동합니다)

ssh user@server "sudo script"

입력하는 동안 비밀번호가 표시되지 않고 SSH를 통해 sudo의 비밀번호를 입력 할 수 있도록이를 수행하는 올바른 방법은 무엇입니까?


2
나에 관해서는, ssh를 통해 sudoing하는 방법을 찾는 이유 ssh <user@server> sudo <script>는 내가 오류를 sudo: no tty present and no askpass program specified
겪었을

답변:


244

다른 방법은 -t스위치를 사용하여 다음 을 수행하는 것입니다 ssh.

ssh -t user@server "sudo script"

참조 man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
니스, 나는 -t 옵션을 알고 있었고 sudo 프롬프트에서 작동한다는 것을 몰랐습니다.

3
-t 옵션은 무엇입니까?
Vince


3
여기서는 작동하지 않습니다 : ssh -t localhost <<< "sudo touch file;"편집 분명히 표준을 통하지 않고 매개 변수로 명령을 제공하는 것이 중요합니다 (이후에는 의미가 있음).
제한 속죄

-t방법은 또한 일반적으로 그렇게하는 명령의 컬러 출력을 보여줍니다.
karmakaze 2016 년

24

다음 명령으로 완전히 자동화 할 수있었습니다.

echo pass | ssh -tt user@server "sudo script"

장점 :

  • 비밀번호 프롬프트 없음
  • 원격 컴퓨터 bash 기록에서 암호를 표시하지 않습니다

에 대해서는 보안 :커트는 말했다,이 명령을 실행하면 해당 지역의 bash는 역사에 대한 암호를 보여주고, 그것의 .sh 파일에있는 모든 명령을 다른 파일이나 저장 암호를 저장하고 실행하는 것이 좋습니다 것입니다. 참고 : 허용 된 사용자 만 액세스 할 수 있도록 파일에 올바른 권한이 있어야합니다.


8
암호를 포함하여 로컬 시스템의 bash 기록에 표시됩니다. 암호를 파일에 저장하고 파일을 정리하는 것이 좋습니다.
커트 피츠너

4
남자, 나는 알고 있었지만 -t, 두 번 전달할 수있을 정도로 매뉴얼을주의 깊게 읽지 못했습니다! 이것은 내가 몇 달 동안 찾고 있었던 것입니다 ! 보안 추가로으로 실행하기 전에 비밀번호 변수를 설정 한 read -s -p "Password: " pw다음을 수행했습니다 echo "$pw" | ..... 나는 이것을 이것을 편리한 스크립트로 만들었습니다 :).
kael

나를 위해 매력처럼 일했다!
MiKr13

특정 사용자 및 명령에 대해 암호없는 sudo를 설정하지 않는 이유는 무엇입니까? 이것은 SSH 문제가 아닙니다 ...
nomen

@ nomen 귀하의 솔루션도 유효하지만 추가 단계가 필요합니다. 암호가없는 sudo 사용자가없는 많은 장치가있는 경우이 솔루션을 사용하여 자동화 스크립트를 작성할 수 있습니다. 때로는 소유하지 않은 시스템에서 작업하고 변경을 원하지 않거나 변경할 수없는 경우가 있습니다. 때로는 다른 고려 사항이 있습니다.
ofirule

6

비밀번호 프롬프트를 원하지 않는다고 가정합니다 .

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
일반 텍스트 비밀번호가 명령 행에 있으므로 / very / 위험합니다. 명령 행은 공용이며 시스템의 다른 모든 사용자와 프로세스가 볼 수 있습니다. 예를 들어, 권한이없는 사용자의 "ps auxwwwww"는 실행중인 모든 프로세스와 프로세스를 실행 한 명령 줄을 표시합니다.
커트 피츠너

3
bash_history 파일에 암호를 넣는 것은 말할 것도 없습니다.
Layne Bernardo

4

비밀번호를 전달하는 SSH를 통한 Sudo는 tty가 필요하지 않습니다.

sudo에게 대화식 암호가 필요하지 않고 stdin에서 암호를 가져 오도록 지시하여 ssh에 의사 tty (ssh "-t"스위치를 사용하지 않고)를 갖지 않고 ssh를 통해 sudo를 사용할 수 있습니다. sudo의 "-S"스위치를 사용하여이 작업을 수행합니다. 이로 인해 sudo는 stdin에서 비밀번호를 청취하고 개행이 표시되면 청취를 중지합니다.

예 1-간단한 원격 명령

이 예에서는 간단한 whoami명령 을 보냅니다 .

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

우리는 sudo에게 프롬프트를 발행하지 말고 stdin에서 입력을 받도록 지시하고 있습니다. 이렇게하면 sudo 비밀번호가 완전히 자동으로 전달되므로을 반환하는 유일한 응답은의 출력입니다 whoami.

이 기술은 stdin 입력이 필요한 ssh over sudo를 통해 프로그램을 실행할 수 있다는 이점이 있습니다. sudo가 stdin의 첫 번째 줄에서 암호를 사용하고 있기 때문에 실행중인 프로그램이 stdin을 계속 잡을 수 있기 때문입니다.

예 2-자체 stdin이 필요한 원격 명령

다음 예에서, 원격 명령 "cat"은 sudo를 통해 실행되며 원격 고양이가 표시하기 위해 stdin을 통해 추가 라인을 제공합니다.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

출력은 <remote_sudo_password>라인이 sudo에 의해 소비되고 있으며 원격으로 실행 된 cat이 여분의 라인을 표시하고 있음을 보여줍니다.

이것이 유리한 곳의 예는 ssh를 사용하여 명령 행을 사용하지 않고 권한있는 명령에 암호를 전달하려는 경우입니다. ssh를 통해 원격 암호화 컨테이너를 마운트하려는 경우를 가정 해보십시오.

예 3-원격 VeraCrypt 컨테이너 마운트

이 예제 스크립트에서는 별도의 프롬프트 메시지없이 sudo를 통해 VeraCrypt 컨테이너를 원격으로 마운트합니다.

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

위의 모든 명령 행 예제 (스크립트를 제외한 모든 것) << EOF에서 명령 행 의 구성은 비밀번호를 포함하여 입력 된 모든 것이 로컬 시스템의 .bash_history에 기록되도록합니다 . 따라서 실제 사용을 위해서는 위의 veracrypt 예제와 같은 스크립트를 통해 전적으로 사용하거나 명령 줄에서 암호를 파일에 넣고 ssh를 통해 해당 파일을 리디렉션하는 것이 좋습니다.

예 1a-예 1 로컬 명령 줄 암호가없는 경우

따라서 첫 번째 예는 다음과 같습니다.

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

예 2a-예 2 로컬 명령 줄 암호가없는 경우

두 번째 예는 다음과 같습니다.

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

스크립트의 내용이 기록에 포함되지 않기 때문에 스크립트에 모든 것을 넣을 경우 별도의 파일에 비밀번호를 입력 할 필요가 없습니다. 암호를 볼 수없는 사용자가 스크립트를 실행할 수 있도록하려면 여전히 유용 할 수 있습니다.


ssh remote 명령 cat에서 결과 를 실행 하여 sudo로 파이프 해야하는 이유는 무엇입니까? sudo기본 ssh 원격 명령으로 사용할 수 있습니까 ?
joanpau

@joanpau 이니셜 cat은 사용자의 비밀번호를 다른 쪽의 sudo로 파이프하는 데 사용됩니다. 사용자가 비밀번호없이 sudo를 실행할 수 있으면 필요하지 않지만이 구성을 권장하지는 않습니다. 파이프 된 이유는 원격 sysrtem의 명령 행에 비밀번호가 표시되지 않도록하기위한 것입니다. 명령 줄은 안전하지 않으므로 모든 사용자는로 모든 명령 줄을 볼 수 있습니다 ps auxwww.
커트 피츠너

나는 catssh 명령을 요구하고 cat \| sudo --prompt="" -S...있습니다. 는 IF -S힘이 sudo표준 입력에서 암호를 읽어, 고양이와 파이프는 전혀 필요합니까? ssh 명령은 간단 할 수 sudo --prompt="" -S...있습니까?
joanpau 2016 년

@jonpau 그 고양이 명령은 sudo 암호를 전달하기 위해 stdin을 가져 와서 sudo를 통해 파이핑합니다. stdin을 통해 ssh를 통해 sudo 비밀번호를 안전하게 파이프하는 방법을 보여줍니다.
커트 피츠너 2018 년

1

가장 좋은 방법은 ssh -t user@server "sudo <scriptname>"예를 들어 ssh -t user@server "sudo reboot"입니다. 먼저 사용자의 비밀번호를 묻는 프롬프트를 표시 한 다음 루트 권한을 갖습니다 (루트 권한으로 스크립트 또는 명령을 실행하므로).

나는 그것이 당신의 의심을 돕고 없애기를 바랍니다.




-1

나는 문제에 직면했다

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

그런 다음 시도했다

#1
vim /etc/sudoers
Defaults:user1    !requiretty

작동하지 않았다

#2
user1   ALL=(user2)         NOPASSWD: ALL

제대로 작동했습니다!


이것은 실제로 요청되는 것을 달성하지 못합니다. 아이디어는 여전히 암호를 요구하지만 ssh를 통해 암호를 입력 할 수 있도록하는 것입니다. 당신이 한 일은 암호없이 user1에게 user2에 대한 전체 sudo 액세스 권한을 부여한 것입니다. 이것은 특정 응용 프로그램에는 적합하지만 일반적인 솔루션으로 가장 좋은 아이디어는 아닙니다.
Possum

-7

사용법에 따라 다음과 같이 성공했습니다.

ssh root@server "script"

루트 암호를 묻는 메시지가 표시되고 명령이 올바르게 실행됩니다.


26
루트로 SSH를 사용합니까? 그것은 모든 종류의 이유로 나쁜 생각입니다.
darkfeline

12
ssh는 텔넷이 아님을 기억하십시오. 다른 사용자로 ssh하고 sudo를 실행하는 것보다 루트로 ssh를 사용하는 것이 더 위험하지 않습니다. 비밀번호는 ssh 연결을 통해 동일한 방식으로 암호화됩니다.
Stéphane

22
암호 보안에 관한 한 스테판은 절대적으로 정확합니다. 그러나 sudo 대신 root를 사용하면 sudo와 함께 제공되는 감사 내역이 손실됩니다. 또한 루트 액세스가 가능하지 않을 수 있습니다.
djeikyb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.