TTY를 무시하지 않고 암호를 su / sudo / ssh에 전달하는 방법은 무엇입니까?


148

suor sudo또는을 수행 할 C Shell 프로그램을 작성 중 ssh입니다. 그들은 모두 stdin이나 명령 줄 대신 콘솔 입력 (TTY)에 암호를 원합니다.

아무도 해결책을 알고 있습니까?

비밀번호없이 설정하는 sudo것은 옵션이 아닙니다.

옵션이 될 수 있지만 벗겨진 시스템에는 없습니다.



답변:


215

sudo의 경우 표준 입력에서 비밀번호를 승인하는 -S 옵션이 있습니다. man 항목은 다음과 같습니다.

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

이를 통해 다음과 같은 명령을 실행할 수 있습니다.

echo myPassword | sudo -S ls /tmp

ssh에 관해서는, 성공하지 않고 사용법을 자동화 / 스크립팅하려고 많은 시도를했습니다. 프롬프트없이 암호를 명령에 전달하는 기본 제공 방법이없는 것 같습니다. 다른 사람들이 언급했듯이, " expect "유틸리티는 이러한 딜레마를 해결하기위한 것 같지만 궁극적으로 올바른 개인 키 인증을 설정하는 것이 자동화를 시도 할 때 올바른 방법입니다.


2
운좋게도 Ruby에는 내장 SSH 클라이언트가있어 비밀번호를 지정할 수 있습니다. ruby -e " 'net / ssh 필요;; Net :: SSH.start ('example.com ','test_user ', : password =>'secret ') 시도하십시오 | ssh | puts'Logged in successfully '; 최종 끝 ";! 풋 ssh.exec (cmd를) cmd를 = 가져 동안
user1158559

13
나는 여기 파티 똥꾼이 싫어, 이렇게하면 암호가 프로세스 목록에 표시 될 수 있습니다. 나는 더 나은 방법을 결정하려고 노력 하고이 기사를 보았고 아무도 그것을 지적하지 않은 것에 놀랐다. 훌륭한 솔루션이지만 위험에주의하십시오.
Matt

SSH에 대해 연결 문자열에 비밀번호를 전달하려고 했습니까? 좋아 nonroot:yourpassword@hostname.com? 물론 키 인증과 키 관리자를 사용하면 훨씬 쉽습니다.
Killah

12
프로세스 목록 또는 로그 파일에 비밀번호를 파일에 넣고 cat을 사용하여 표시하지 않도록하십시오. 'cat pw | sudo -S <command>그리고 나중에 rm pw.
CAB

또 다른 방법은 netcat을 사용하고 소켓을 통해 암호를 전달하는 것 nc -l 12345 | sudo -S <command>입니다. 송신 측에서; echo myPassord | nc <target> 12345. 이것은 암호 처리 문제를 옮기지 만 더 많은 옵션이있는 마스터 콘솔로 이동합니다.
CAB

36

대화 상자를 통해 암호를 묻는 Applescript를 작성한 다음 다음과 같이 사용자 정의 bash 명령을 작성합니다.

echo <password> | sudo -S <command>

이것이 도움이되는지 확실하지 않습니다.

sudo가 사전 암호화 된 암호를 수락하면 스크립트 내에서 암호를 암호화하고 일반 텍스트 암호를 에코하는 것에 대해 걱정할 필요가 없습니다. 그러나 이것은 나와 내 상황에 효과적입니다.


27

들어 ssh당신이 사용할 수 있습니다 sshpass:sshpass -p yourpassphrase ssh user@host .

sshpass를 먼저 다운로드해야합니다 :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

나는 가지고있다 :

ssh user@host bash -c "echo mypass | sudo -S mycommand"

나를 위해 작동합니다.


나를 위해 작동하지 않았다. 여전히 ssh는 비밀번호를 묻습니다.
AKS

훌륭하고 마침내 내가 사용할 수있는 것! 감사. ssh 세션을 시작하고 sudo 명령을 클라이언트에 전달하는 bash 스크립트 내에서 이것을 사용합니다. 내 스크립트에는 해결 방법이 있습니다. ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell

12

sudo의 경우 다음과 같이 할 수도 있습니다.

sudo -S <<< "password" command

10

이 문제에 대한 일반적인 해결책은 수퍼 유저 액세스가 필요한 작업을 수행하는 도우미 앱을 설정하는 것입니다. http://en.wikipedia.org/wiki/Setuid

Sudo는 오프라인에서 사용하기위한 것이 아닙니다.

나중에 편집 : SSH는 개인-공개 키 인증과 함께 사용할 수 있습니다. 개인 키에 암호가 없으면 암호를 묻지 않고 ssh를 사용할 수 있습니다.


10

연결하려는 대상 호스트에서 공개 / 개인 키를 설정하면됩니다. 첫 번째 단계는 다음을 실행하여 로컬 호스트에서 스크립트를 실행하는 사용자에 대한 ssh 키를 생성하는 것입니다.

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

그런 다음 빈 암호를 입력하십시오. 그런 다음 ssh 키를 연결할 대상 호스트에 복사하십시오.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

ssh 키를 등록 ssh remote_user@other_host하면 로컬 호스트에서 자동 응답을 수행 할 수 있습니다 .


7

어쩌면 expect명령을 사용할 수 있습니까? :

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

이 명령은 암호를 자동으로 제공합니다.


근사해 보이지만 루트 권한없이 maschine에서 expect 명령을 어떻게 활성화 할 수 있습니까?
Radon8472

1
@ Radon8472 설치 권한이 없으면 ~ / bin에 실행 파일이 추가 될 수 있습니다. 시스템이 PATH에 ~ / bin을 자동으로 추가하지 않으면 export PATH = "$ PATH : ~ / bin"을 사용하여 수동으로 추가하거나 해당 명령을 프로파일에 추가하여 자동으로 수행 할 수 있습니다. PATH를 변경하지 않으려면 절대 경로를 사용하여 명령을 대신 실행할 수 있습니다. ~ / bin / expect [arguments] 실행 비트를 설정해야합니다. chmod + x ~ / bin / expect
StarCrashr

6

더 나은 선택이 없다면 (다른 사람들이 제안한대로) man socat이 도울 수 있습니다.

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

pty, setsid, ctty의 모든 복잡성이 필요하며 오랫동안 잠을 잘 필요가 없지만 잠을 잘 필요가 있습니다. echo = 0 옵션은 ssh의 명령 행에서 원격 명령을 전달하는 것처럼 볼만한 가치가 있습니다.


1
이것은 실제로 su잘 작동 합니다. su-S (stdin) 옵션이 없습니다.
aus

수면을 피하고 대신 더 안정적인 것을 사용할 수 있습니까?
Michael Pankov

6

expect리눅스 유틸리티를 살펴보십시오 .

stdin의 간단한 패턴 일치를 기반으로 stdio에 출력을 보낼 수 있습니다.


1

키에 암호를 입력하지 않고 공개 키 인증을 위해 SSH를 설정하십시오. 그물에 가이드로드. 그런 다음 로그인 할 때 비밀번호가 필요하지 않습니다. 그런 다음 클라이언트 호스트 이름을 기준으로 키 연결을 제한 할 수 있습니다. 합리적인 보안을 제공하며 자동 로그인에 적합합니다.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

ssh 키를 사용하여 사용자로 로그인 할 수 있으면 sudo 액세스가 가능합니다. ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack

0

나는 같은 문제가 있었다. 원격 PC에 디렉토리를 작성하는 대화 스크립트. ssh와의 대화는 쉽습니다. sshpass (이전 설치)를 사용합니다.

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

독일에서 인사

타투 스


0

@Jahid의 답변을 바탕으로 macOS 10.13에서 저에게 효과적이었습니다.

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

더 나은 sshpass대안은 다음과 같습니다. passh https://github.com/clarkwang/passh

원격 서버에 로그인

 $ passh -p password ssh user@host

원격 서버에서 명령을 실행하십시오.

 $ passh -p password ssh user@host date

비밀번호를 전달하는 다른 방법

-p 패스워드 (디폴트 :`password ')

-p env : env var에서 비밀번호 읽기

-p 파일 : 파일에서 비밀번호 읽기

여기에서 sshpass 및 기타 솔루션보다 나은 이유를 설명했습니다.


-1
echo <password> | su -c <command> <user> 

작동합니다.


1
이것은 Fedora에서 유일한 사람입니다. 사람들은 자신의 상황에서 일하지 않기 때문에 답을 공감합니까?
Hangchen Yu

2
"su : 터미널에서 실행해야합니다"(RPi1B, Raspbian)
notme1560

불행히도 이것은의 최신 버전이 아니고 대신 stdiosu 에서 비밀번호를 읽습니다 .
moutonjr

-1

expect 스크립트에서 암호를 하드 코딩하는 것은 암호가없는 sudo를 갖는 것과 동일합니다. sudo는 최소한 명령을 기록하기 때문입니다.



-1

사용하다:

echo password | sudo command

예:

echo password | sudo apt-get update; whoami

도움이 되길 바랍니다 ..


-2

스크립트를 예상하기 위해 비밀번호를 매개 변수로 제공 할 수 있습니다.


-11
su -c "Command" < "Password"

도움이 되길 바랍니다.


1
그렇지 않습니다. "su : 터미널에서 실행해야합니다"가 이에 대한 답입니다.
thelogix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.