ssh-copy-id 자동화 동일한 사용자 /

동일한 사용자 / 패스 조합을 가진 임의의 수의 서버가 있습니다. 스크립트를 작성하고 싶습니다 (한 번 호출).

ssh-copy-id user@myserver

각 서버마다 호출됩니다. 그들은 모두 동일한 사용자 / 패스를 가지고 있기 때문에 이것은 쉽지만 ssh-copy-id스크립트의 목적을 어길 때마다 암호를 개별적으로 입력하기를 원합니다. 비밀번호를 입력 할 수있는 옵션이 없습니다 (예 🙂 ssh-copy-id -p mypassword user@myserver.

암호 필드를 ssh-copy-id요구할 때 자동으로 암호 필드를 채우는 스크립트를 작성하려면 어떻게 해야합니까?



답변

sshpass를 살펴 보십시오 . 비밀번호를 텍스트 파일에 넣고 다음과 같이하십시오.

$ sshpass -f password.txt ssh-copy-id user@yourserver


답변

expect를 사용하여 비밀번호 프롬프트를 청취하고 비밀번호를 보낼 수 있습니다.

#!/usr/bin/expect -f
spawn ssh-copy-id $argv
expect "password:"
send "YOUR_PASSWORD\n"
expect eof

스크립트를 저장하고 실행 가능하게 만들고 다음과 같이 호출하십시오. ./login.expect user@myserver


답변

quanta의 답변은 꽤 좋지만 텍스트 파일에 암호를 입력해야합니다.

“sshpass”매뉴얼 페이지에서 :

옵션을 지정하지 않으면 sshpass는 표준 입력에서 비밀번호를 읽습니다.

따라서 스크립트 중에 비밀번호를 한 번 캡처하여 변수에 저장 한 후 비밀번호를 에코하고 입력으로 spass하는 파이프를 파이프하는 것이 가능합니다.

나는 항상 이것을하고 잘 작동합니다. 예:

echo "Please insert the password used for ssh login on remote machine:"
read -r USERPASS
for TARGETIP in $@; do
echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP"
done


답변

이것은 ssh-copy-id의 문제입니다. 또한 실행할 때마다 키를 추가합니다. 프로세스를 자동화하는 경우 authorization_keys 파일이 중복 키로 빠르게 복잡해집니다. 다음은 두 가지 문제를 피하는 Python 프로그램입니다. 제어 서버에서 실행되며 한 원격 서버의 키를 다른 원격 서버에 넣습니다.

import subprocess
def Remote(cmd,IP):
    cmd = '''ssh root@%s '''%(IP)+cmd
    lines = subprocess.check_output(cmd.split())
    return '\n'.join(lines)
source = '123.456.78.90'
target = '239.234.654.123'
getkey = 'cat /root/.ssh/id_rsa.pub'
getauth = 'cat /root/.ssh/authorized_keys'
sourcekey = Remote(getkey, source).replace('\n','').strip()
authkeys = Remote(getauth, target).replace('\n','').strip()
if sourcekey not in authkeys:
    keycmd=''' echo "%s" >>/root/.ssh/authorized_keys;
    chmod 600 /root/.ssh/authorized_keys '''%(sourcekey) # A compound shell statement
    print 'Installed key', Remote(keycmd,target)
else: print 'Does not need key'


답변

암호를 여러 번 입력하는 대신 pssh-A스위치를 사용 하여 한 번 묻고 암호를 목록의 모든 서버에 제공 할 수 있습니다.

참고 : 이 방법을 사용하면을 사용할 ssh-copy-id수 없으므로 SSH pub 키 파일을 원격 계정 파일에 추가하기위한 고유 한 방법을 롤링해야 ~/.ssh/authorized_keys합니다.

다음은 작업을 수행하는 예입니다.

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

위 스크립트는 일반적으로 다음과 같이 구성됩니다.

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

높은 수준의 pssh세부 사항

  • cat <pubkey> 공개 키 파일을 pssh
  • pssh-I스위치를 사용하여 STDIN을 통해 데이터를 수집합니다.
  • -l <remote user> 원격 서버의 계정입니다 (IP 파일의 서버에서 동일한 사용자 이름이 있다고 가정합니다)
  • -Apssh암호를 묻고 연결된 모든 서버에 대해 암호를 다시 사용하도록 지시 합니다.
  • -ipssh출력을 파일에 저장하지 않고 STDOUT에 전송하도록 지시 합니다 (기본 동작).
  • '...cmds to add pubkey...'-이것은 현재 진행중인 작업 중 가장 까다로운 부분이므로이 부분을 자체적으로 분석합니다 (아래 참조).

원격 서버에서 실행중인 명령

다음은 pssh각 서버에서 실행될 명령입니다 .

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'

순서대로 :

  • 원격 사용자의 umask를 077로 설정하면 우리가 만들 디렉토리 또는 파일에 따라 권한이 다음과 같이 설정됩니다.

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
    
  • 디렉토리를 만들고 ~/.ssh이미 존재하는 경우 경고를 무시하십시오.

  • $afileauthorized_keys 파일의 경로와 함께 변수를 설정 하십시오.
  • cat - >> $afile -STDIN에서 입력을 받고 authorization_keys 파일에 추가
  • sort -u $afile -o $afile -authorized_keys 파일을 고유하게 정렬하여 저장합니다

참고 : 마지막 비트는 동일한 서버에 대해 위를 여러 번 실행하는 경우를 처리하는 것입니다. 이렇게하면 펍키가 여러 번 추가되지 않습니다.

단일 진드기를 주목하십시오!

또한 이러한 모든 명령이 작은 따옴표 안에 중첩되어 있다는 사실에 특히주의하십시오. $afile원격 서버에서 실행될 때까지 평가를 받고 싶지 않기 때문에 중요 합니다.

'               \
   ..cmds...    \
'

위의 내용을 확장하여 여기에서 쉽게 읽을 수 있지만 일반적으로 다음과 같이 한 줄로 모두 실행합니다.

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

보너스 자료

를 사용 pssh하면 파일을 작성하지 않고 동적 컨텐츠를 제공 -h <(...some command...)하거나 다른 pssh스위치를 사용하여 IP 목록을 작성할 수 있습니다 -H "ip1 ip2 ip3".

예를 들면 다음과 같습니다.

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

위의 내용은 내 ~/.ssh/config파일 에서 IP 목록을 추출하는 데 사용될 수 있습니다 . 물론 printf동적 컨텐츠를 생성 하는 데 사용할 수도 있습니다 .

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

예를 들면 다음과 같습니다.

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

seq형식화 된 숫자 시퀀스도 생성 할 수 있습니다 !

참조 및 유사한 도구 pssh

pssh위와 같이 사용하지 않으려면 다른 옵션을 사용할 수 있습니다.


답변

병렬 SSH 도구 (clusterssh, mssh, pssh) 중 하나가 적합 할 수 있습니다.

예를 들어, cssh를 사용하여 모든 시스템에 로그인하고 키를 직접 추가하십시오.


답변

청구서에 맞는 몇 가지 사항 :

다른 답변에서 언급했듯이 sshpass가 가장 쉬운 솔루션 일 것입니다.