동일한 사용자 / 패스 조합을 가진 임의의 수의 서버가 있습니다. 스크립트를 작성하고 싶습니다 (한 번 호출).
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 파일의 서버에서 동일한 사용자 이름이 있다고 가정합니다)-A
pssh
암호를 묻고 연결된 모든 서버에 대해 암호를 다시 사용하도록 지시 합니다.-i
pssh
출력을 파일에 저장하지 않고 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
이미 존재하는 경우 경고를 무시하십시오. $afile
authorized_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를 사용하여 모든 시스템에 로그인하고 키를 직접 추가하십시오.
답변
청구서에 맞는 몇 가지 사항 :
- 기능적으로 동일한 질문이 있습니다. 비밀번호를 계속 입력하지 않고도 SSH pub 키를 서버 목록 에 어떻게 전파 할 수 있습니까? .
- 펄 모듈이 있지만 많이 유지되지 않는 것 같습니다 : https://github.com/Ruyk/pssh-copy-id
다른 답변에서 언급했듯이 sshpass가 가장 쉬운 솔루션 일 것입니다.