Ssh, oturum açmada bir komut çalıştır ve ardından Oturum Açılsın mı?


29

Beklentiyle bunu denedim, ama işe yaramadı: sonunda bağlantıyı kapattı.

Uzak makinelere giriş yapan, komut çalıştıran ve bağlantıyı kesmeyen bir komut dosyası ssh ile çalıştırabilir miyiz?

Bir makinede ssh, böyle ve böyle bir dizine cd ve sonra bir komut çalıştırın ve oturumunuz açık kalsın.

-Jonathan

(kullandığımı umuyorum)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
Sadece ben miyim yoksa pubkey veya diğer mantıklı bir yöntem kullanmak yerine şifre doğrulamasını bu şekilde "otomatikleştiriyor musunuz"?
Grawity

Yanıtlar:


25

; /bin/bashUzak taraftaki komut satırının sonuna bir ekle ? Yani:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Daha da iyisi, root'un .bashrc'sini şu şekilde değiştirin:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
Bu -ibash'a eklemek isteyebilirsiniz .
Teddy

Evet, sanırım :)
Bill Weiss

Bunu yaptığımda, sekme tamamlama yeni kabuğa bölünüyor ("-i" ile bile) - neden / nasıl düzeltilmeli?
Coderer

1
Yeni cevabımı burada test ettim, harika çalışıyor. Biraz kaba, ama işe yarıyor.
Bill Weiss,

7
ssh -tBir miktar ayırmaya çalışın .
sonraki duyuruya kadar duraklatıldı.

4

Bunu Python'da yapmakta sorun yaşıyorsanız , pexpect'in neredeyse tam olarak ne istediğinizi yapan bir örneği var:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Bunu ftp yerine ssh ile yapmak için, aşağıdakine benzer bir kod istersiniz (pexpect'teki örnek dosyalar daha fazla ayrıntıya ve bilgiye sahiptir, ancak temel bilgiler aşağıdadır):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Beni yanlış anlama, BEKLİYORUM (özellikle otomatik inceleme), ancak python benim için sadece çok kolay.


Ben de bekleyişten umutsuzluğa geçiyorum. Python şimdi çok daha yaygın.
JM Becker,

4

Bir sunucuya ssh kurmanın, etkileşimli bir kabuk oluşturup komutları çalıştırmanın en kolay ve en temiz yolu bash için özel bir rc dosyası oluşturmaktır.

Sunucudaki özel bashrc dosyanızda, önce varsayılan dosyayı kaynaklayın ve sonra özel komutlarınızı ekleyin, örn.

~ / .Bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

SSH oturumunuzu şöyle başlatabilirsiniz:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

-tSeçenek kuvvetleri sahte tty tahsisi, sekme tamamlama işi gibi şeylerden böylece.

--rcfileRcfile seçenek belirtir yerine varsayılan birinin yüklemek için. Önemli: Tanınmak için tek karakterli seçeneklerden önce komut satırına "çift çizgi argümanları" koymalısınız.

-i/ Bin / bash argüman etkileşimli bir kabuk vardır çağırmaktır.


aslında değil. Her bağlantı için farklı komutlar çalıştırmak istersem ne yapmalıyım?
Eugen Konkov

1

Herhangi biri arka planda olanlarla ilgili bilgi isterse, sshd kılavuzuna bir göz atmalısınız:

Bir kullanıcı başarıyla giriş yaptığında, sshd aşağıdakileri yapar:

  1. Giriş bir tty ise ve herhangi bir komut belirtilmemişse, son giriş zamanını ve / etc / motd dosyasını yazdırır (yapılandırma dosyasında veya ~ / .hushlogin tarafından engellenmediği sürece; FILES bölümüne bakın).
  2. Giriş bir tty ise, giriş zamanını kaydeder.
  3. Çekler / etc / nologin ve / var / run / nologin; eğer varsa, içeriği basar ve çıkar (root değilse).
  4. Normal kullanıcı ayrıcalıklarıyla çalıştırılacak değişiklikler.
  5. Temel ortamı kurar.
  6. Varsa ~ / .ssh / ortam dosyasını okur ve kullanıcıların ortamlarını değiştirmelerine izin verilir. Sshd_config (5) 'te PermitUserEnvironment seçeneğine bakın.
  7. Kullanıcının giriş dizinindeki değişiklikler.
  8. ~ / .Ssh / rc varsa, onu çalıştırır; Başka / etc / ssh / sshrc varsa, çalıştırır; aksi takdirde xauth (1) çalışır. `` Rc '' dosyalarına X11 kimlik doğrulama protokolü ve tanımlama bilgisi standart girişte verilir. Aşağıdaki SSHRC'ye bakınız.
  9. Kullanıcının kabuğunu veya komutunu çalıştırır .

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

Genellikle ssh'ı amacını yitirdiği gibi kullanmaktan kaçınmalısınız.
Bir yap

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

Anahtarınızın ssh aktif oturum havuzunda listelenip listelenmediğini görmek veya başka bir şey eklemek için (ssh-add).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.