Ssh, jalankan perintah saat login, lalu Tetap Masuk?

29

Saya mencoba ini dengan harapan, tetapi tidak berhasil: itu menutup koneksi di akhir.

Bisakah kita menjalankan skrip melalui ssh yang akan masuk ke mesin jarak jauh, menjalankan perintah, dan tidak memutuskan sambungan?

Jadi ssh di mesin, cd ke direktori ini dan itu, dan kemudian jalankan perintah, dan tetap masuk.

-Jonathan

(harap saya menggunakan)

#!/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
Jonathan
sumber
9
Apakah hanya saya atau Anda "mengotomatiskan" otentikasi kata sandi dengan cara ini, daripada menggunakan pubkeys atau metode waras lainnya?
grawity

Jawaban:

25

Tambahkan a ; /bin/bashke akhir baris perintah Anda di sisi jarak jauh? Itu adalah:

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

Bahkan lebih baik, ubah .bashrc root menjadi seperti ini:

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

:)

Bill Weiss
sumber
2
Anda mungkin ingin menambahkan -ike bash itu.
Teddy
Yeh, saya kira :)
Bill Weiss
Ketika saya melakukan itu, penyelesaian tab rusak di shell baru (bahkan dengan "-i") - tahu mengapa / bagaimana cara memperbaikinya?
Coderer
1
Saya menguji jawaban baru saya di sini, itu berhasil. Sedikit kasar, tetapi berhasil.
Bill Weiss
7
Cobalah ssh -tuntuk mengalokasikan pty.
Dijeda sampai pemberitahuan lebih lanjut.
4

Jika Anda baik-baik saja dengan melakukan hal ini dengan Python, pexpect memiliki contoh yang hampir sama persis dengan yang Anda minta:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
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.

Untuk melakukan ini dengan ssh daripada ftp, Anda ingin kode yang mirip dengan yang berikut ini (contoh file di pexpect memiliki lebih banyak detail dan info, tetapi inilah dasarnya):

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.

Jangan salah paham, SAYA SUKA berharap (terutama autoexpect), tetapi python hanya sangaaaat lebih mudah bagi saya untuk grok.

Jed Daniels
sumber
Saya juga sedang transisi dari yang diharapkan ke yang diharapkan. python sekarang jauh lebih di mana-mana.
JM Becker
4

Cara yang mungkin paling mudah dan paling bersih untuk ssh ke server, menelurkan shell interaktif dan menjalankan perintah di dalam shell itu adalah membuat file rc kustom untuk bash.

Dalam file bashrc kustom Anda di server, pertama sumber file default dan kemudian tambahkan perintah kustom Anda, misalnya

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Anda kemudian dapat memulai sesi SSH Anda seperti ini:

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

The -tpasukan pilihan alokasi pseudo-tty, sehingga hal-hal seperti pekerjaan tab-selesai.

The --rcfilemenspesifikasikan opsi yang rcfile untuk memuat bukan yang default. Penting: Anda harus meletakkan "argumen dasbor ganda" pada baris perintah sebelum opsi karakter tunggal agar dapat dikenali.

The -iargumen untuk / bin / bash ada untuk memohon shell interaktif.

Danilo Bargen
sumber
sebenarnya tidak. Apa yang harus saya lakukan jika saya ingin menjalankan perintah yang berbeda untuk setiap koneksi?
Eugen Konkov
1

Jika ada yang menginginkan informasi tentang apa yang terjadi di latar belakang, Anda harus melihat pada manual sshd:

Ketika pengguna berhasil masuk, sshd melakukan hal berikut:

  1. Jika login berada di tty, dan tidak ada perintah yang ditentukan, mencetak waktu login terakhir dan / etc / motd (kecuali dicegah dalam file konfigurasi atau oleh ~ / .hushlogin; lihat bagian FILES).
  2. Jika login menggunakan tty, catat waktu login.
  3. Cek / etc / nologin dan / var / run / nologin; jika ada, ia mencetak konten dan berhenti (kecuali root).
  4. Perubahan untuk dijalankan dengan hak pengguna normal.
  5. Mengatur lingkungan dasar.
  6. Membaca file ~ / .ssh / environment, jika ada, dan pengguna diizinkan untuk mengubah lingkungannya. Lihat opsi PermitUserEnvironment di sshd_config (5).
  7. Perubahan ke direktori home pengguna.
  8. Jika ~ / .ssh / rc ada, jalankan; jika tidak ada / etc / ssh / sshrc, jalankan; jika tidak, jalankan xauth (1). File `` rc '' diberikan protokol otentikasi dan cookie X11 dalam input standar. Lihat SSHRC, di bawah ini.
  9. Menjalankan shell atau perintah pengguna.

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

Gerry
sumber
0

Anda umumnya harus menghindari menggunakan ssh dengan cara seperti ini karena itu mengalahkan tujuan itu.
Lakukan

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

untuk melihat apakah kunci Anda terdaftar di kumpulan sesi aktif ssh atau tambahkan sendiri (dengan ssh-add).

Kounavi
sumber