1 Haziran 2020 Pazartesi

ssh İle Karşı Sunucuda Komut Çalıştırma

Giriş

1. Karşı Sunucuda Açılan Shell
ssh ile karşıdaki sunucuya giriş yaptıktan sonra bizim için bir tane shell açılır. Bu shell kullanıcı ayarlarında ne tanımlı ise o shell'dir. Dolayısıyla komutun içine tekrar bash yazmaya gerek yok.

Örnek
Şu komut istenileni vermez. Çünkü bir daha bash çalıştırılmaya çalışılıyor
$ ssh remote bash -c 'ls file-*'
Şöyle yaparız.
$ ssh remote ls file-*'
2.Seçenekler
-n seçeneği
Örnek
Elimizde şöyle bir kod olsun.  Bu kod sadece ilk sunucuda çalışır.
#!/bin/sh
SERVERLIST=hosts
ICMD='cat /etc/redhat-release'
while read SERVERNAME
do
   ssh $SERVERNAME $ICMD
done < "$SERVERLIST"
Açıklaması şöyle
ssh pre-reads stdin on the assumption that the remote job will want some data, and it makes for a faster start-up. So the first job eats the rest of your hosts list.

You can prevent this happening either using the ssh -n option, or by redirecting like ssh < /dev/null. Being a belt-and-braces man, I do both: ssh -n < /dev/null <other ssh options>.
Düzeltmek için şöyle yaparız
#!/bin/sh
SERVERLIST=servername.dat
ICMD='cat /etc/fstab'
while read SERVERNAME
do
   ssh -n $SERVERNAME $ICMD > $SERVERNAME_report.txt
done < "$SERVERLIST"
-t seçeneği
Shell'e ait bir tty olmak zorunda değildir. Bu durumda -t seçeneği ile birlikte kullanılır. Açıklaması şöyle. Eğer -t seçeneği bir kere kullanılırsa pseudo tty açılır. Eğer iki kere kullanılırsa gerçek tty açılır
-t   Force pseudo-tty allocation.  This can be used to execute arbi-
     trary screen-based programs on a remote machine, which can be
     very useful, e.g. when implementing menu services.  Multiple -t
     options force tty allocation, even if ssh has no local tty.
Şöyle yaparız.
ssh -tt user@ip 'ls -la; bash'

3. Çeşitli Örnekler

Komut Genellikle Tek Tırnak İçinde Gönderilir
Tek tırnak  ile raw string gibi hiç bir işleme uğramadan gönderilir. bash kodlama - tırnak yazısına bakabilirsiniz.

Örnek - bash
Şöyle yaparız. Tek tırnak içindeki kısım aynen karşı tarafa gönderilir.
ssh root@host 'bash -s' < command1
Örnek
Komut bitince ssh içinde kalmak için şöyle yaparız. Tek tırnak içindeki kısım aynen karşı tarafa gönderilir.
ssh -t -p port_num user@remote
  bash --init-file '<(echo "sudo docker logs -f service_name")'
Örnek - bash Here Document
"Here Document" yöntemi ile birden fazla komut çalıştırmak için şöyle yaparız.
ssh otherhost << EOF
  ls some_folder; 
  ./someaction.sh 'some params'
  pwd
  ./some_other_action 'other params'
EOF
Örnek - bash Here Document
"Here Document" yöntemi ile birden fazla komut çalıştırmak için şöyle yaparız.
ssh -t -p port_num user@remote << HERE
> sudo su -
> docker logs -f service_name
> HERE
Örnek - bash Here Document
Şöyle yaparız. Burada komutumuz içinde de tek tırnak olduğu için Here Documen kullanmak daha iyi.
ssh server.name /bin/sh <<'EOF'
find /dir1/subdir/filelist* -maxdepth 1 -type f -mtime 0 -exec grep 'pattern' {} \;
EOF
Örnek - cat komutu
Şöyle yaparız. gzip dosyayı stdout'a yazar. Onu da ssh okur ve cat komutuna verir. Cat komutu da dosyaya yazar.
gzip -c file.txt | ssh user@ip "cat > destfile.gz"
Örnek - echo komutu
Karşı sunucundaki bash sürümünü öğrenmek için şöyle yaparız. Tek tırnak içindeki kısım aynen karşı tarafa gönderilir.
ssh me@somehost 'echo "$BASH_VERSION"'
Örnek - poweroff komutu
Şöyle yaparız.
ssh 192.168.1.10 "sudo poweroff"
Örnek - ssh çıktısını subshell içinde yapmak
ssh çıktısını almak için şöyle yaparız. Burada subshell içindeki ssh benim stdin'inimi okumasın isteniyor. Bir başka örnek burada
http_status=$(ssh $name "ps -ef | grep -v grep | grep $service | wc -l" 
  < /dev/null)
Örnek - ssh çıktısını yönlendirme
Şöyle yaparız
ssh -l user $IP "dd if=/dev/zero count=3500 bs=1M status=progress" > /dev/null
Örnek - ssh girdisi subshell
Kendi bilgisayarımdaki bir şeyi karşıya göndermek için subshell açarım. Şöyle yaparız. Kendi saatimi karşı tarafın saatine değiştirmek için kullanırım
ssh pi@hostname.local sudo date -s$(date -Ins)
Örnek - ssh girdisinde boşluk olması
Şöyle yaparız. Burada print sonucunda içinde boşluk olan bir çıktı üretiliyor. Bunu ssh komutuna geçiyoruz. ssh ta karşı makinede çalışacak xargs komutuna geçiyor
printf '%s\0' "$DEST_PATH/subdir1" "$DEST_PATH/subdir2" |
  ssh -i key 10.10.10.10 'xargs -0 mkdir -p --'
Örnek - ssh çıktısı
Bağlanıncaya kadar tekrar etmek için ~/.bashrc dosyasına şöyle yaparız
repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}

Hiç yorum yok:

Yorum Gönder