프로그래밍/리눅스 프로그래밍

ssh 원격 명령 실행

jinkwon.kim 2016. 12. 27. 22:14
728x90
반응형

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

 

 

 

 

 

 

 

 

728x90
반응형