ssh 원격 명령 실행
한줄 명령 실행
- ssh server_ip "ls -la;df"
여려줄 명령 실행
- <HEREDOC을 사용하는 방법>
ssh server_ip <<\EOF
ls -la
df
EOF
원격 스크립트 실행
별도의 쉘스크립트를 만들고 원격에 스크립트 해석기를 실행시키고 파이프나 리다이렉션으로 보내는 방법
- test_script.sh
#!/bin/sh
ls -la
df - cat test_script.sh | ssh server_ip sh 또는 ssh server_ip sh < test_script.sh
Perl 스크립트를 ssh를 통해 실행
- cat perl_script.pl | ssh myserver perl 또는 ssh myserver perl < perl_script.pl
이것을 기초로 여러 서버에 명령을 내리려면 다음처럼 서버의 리스트를 만들고 리스트에 대해 루프를 돌면서 위의 명령을 서버별로 실행하면 될 것이다.
다중 서버에 스크립트를 실행
- #!/bin/sh
SERVERS="
myserver1
myserver2
"
for m in $SERVERS
do
ssh $m sh < test_script.sh
done
이렇게 하면 문제는 순차적으로 실행을 하기 때문에 한 서버씩 실행이 끝날 때 까지 기다려야 해서 속도가 늦고 나중에 결과를 보기가 힘들다는 것이다.
그러면
ssh $m sh < test_script.sh
줄을 다음과 같이
ssh $m sh < test_script.sh > $m.log &
고치면 각 ssh 명령이 fork되어서 백그라운드로 돌고 각 서버에 대한 결과는 서버이름.log 파일로 남게 된다. ( 작업결과는 *.log 파일들에 대해 grep이나 기타 유틸리티로 일괄적으로 확인 가능할 것이다. )
지금까지는 별도의 프로그램을 쓰지 않고 순수하게 기본 명령과 쉘스크립트 가지고 하는 방법이다. 하지만 이런 류의 작업은 다수의 서버를 관리 할 때 빈번하게 발생하므로 좀 더 많은 기능을 지원하면서 이런 작업을 해주는 프로그램이 많다.
shmux 라는 프로그램이 그런 것 중 하나인데 http://web.taranis.org/shmux/ 에 가보면 아랫쪽에 비슷한 기능을 하는 다음과 같은 프로그램 리스트가 쭉 있다.
트러블 슈팅
키 교환 실패 (client 쪽 수정)
Unable to negotiate with UNKNOWN port 65535: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
해결법
/etc/ssh/ssh_config 수정
주석 해제
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
기능 추가
HostkeyAlgorithms ssh-dss,ssh-rsa
KexAlgorithms +diffie-hellman-group1-sha1
최종
cat /etc/ssh/ssh_config
Include /etc/ssh/ssh_config.d/*.conf
Host *
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
# RekeyLimit 1G 1h
# UserKnownHostsFile ~/.ssh/known_hosts.d/%k
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes
HostkeyAlgorithms ssh-dss,ssh-rsa
KexAlgorithms +diffie-hellman-group1-sha1
no key alg (server쪽 수정)
/etc/ssh/sshd_config 맨 아래에 추가
KexAlgorithms +diffie-hellman-group1-sha1
no hostkey alg (server 쪽 수정)
/etc/ssh/sshd_config 맨 아래에 추가
HostKeyAlgorithms +ssh-rsa
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[bash] 가장 혼란 스러운 문법정리 (0) | 2018.03.08 |
---|---|
메모리 맵 관련 함수 (0) | 2017.05.04 |
리눅스 프로세스별 메모리 사용량 확인법 (0) | 2017.01.24 |
Linux 분할 컴파일시 유의 사항. (2) | 2017.01.11 |
Bash Script 유용한 Tip (0) | 2016.12.27 |