[ssh] ssh를 극복하는 적절한 방법

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

ssh user@server "sudo script"

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



답변

다른 방법은 -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.


답변

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

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

장점 :

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

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


답변

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

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

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


답변

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

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


답변

NOPASS대상 시스템의 구성에 솔루션이 있습니다. http://maestric.com/doc/unix/ubuntu_sudo_without_password 에서 계속 읽으십시오


답변

echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost
echo \"$varCommand\" | sudo bash