Jalankan perintah ssh Remote dengan Shell Login Lengkap


48

Saya ingin melakukan sesuatu seperti halaman ssh example.com 'ls'Namun per ssh:

Jika perintah ditentukan, ini dijalankan pada host jarak jauh alih-alih shell login.

Jadi yang terjadi adalah lsmenampilkan outputnya dan kemudian ssh keluar.

Apa yang saya tidak tahu adalah bagaimana membuka shell login penuh dan kemudian menjalankan perintah di dalam shell itu. Membiarkan shell terbuka setelah perintah dijalankan. Seolah-olah saya telah secara manual melakukan hal berikut:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Ada ide?


ini adalah pertanyaan serupa superuser.com/questions/261617/… tetapi tidak ada jawaban yang benar-benar cocok dengan apa yang saya coba lakukan.
matthew

Bagaimana dengan ssh example.com 'ls;bash'?
Andrejs Cainikovs

Anda memerlukan -i pada sistem saya untuk membuat shell kedua yang interaktif.
Flexo

opsi -t adalah jawaban untuk pertanyaan Anda. Pilihan lain (misalnya gantungan kunci) ada tetapi tergantung pada kebutuhan nyata Anda, yang tidak cukup jelas bagi saya.
hornetbzz

@hornetbzz -t memberi saya pseudo-tty. Tetapi sebaliknya perilakunya sama. Saya ingin meluncurkan shell interaktif, jalankan perintah di dalam shell itu dan biarkan shell tetap terbuka setelah perintah dijalankan.
matthew

Jawaban:


40

Katakan saja bash untuk mengeksekusi lsdan kemudian sendiri di shell login

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
Sayangnya ini sepertinya tidak berfungsi saat menggunakan screen. Kalau tidak, ini sepertinya melakukan apa yang saya coba lakukan.
matthew

31
ssh user@host -t 'ls; exec $SHELL -l'

-tPaksa alokasi pseudo-terminal. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh. Sedikit lebih tepat daripada bash -i.

exec Tidak ada proses baru yang dibuat.

-lmencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca dan mengeksekusi perintah dari ... Tanpa ini Anda mungkin tidak dapat menjalankan skrip / perintah dari direktori ~ / bin, karena kode ini dari ~ / .profile tidak akan dieksekusi tanpa -ltanda:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan Ini mungkin berfungsi sebagai solusi, tapi saya benar-benar ingin perintah dijalankan di dalam shell dan tidak hanya membuka shell baru setelah perintah dijalankan.
matthew

+1, -t jelas merupakan cara yang tepat untuk membahas -i, saya lupa saja.
Flexo

@matthew: Anda harus menambal bashdiri sendiri untuk mengizinkannya.
grawity

@grawity tidak juga, lihat jawaban saya di bawah
fons

@matthew, gunakan exec bashatauexec $SHELL
Eugen Konkov

1

Dalam komentar Anda tentang jawaban si kembar, Anda mengatakan itu tidak berfungsi saat menggunakan screen.

Bisakah Anda menguraikan itu? Melihat kode sumber untuk openssh, sshd mengeksekusi perintah dengan memanggil

YOUR_DEFAULT_SHELL -c COMMAND

Jadi, misalnya, jika shell default Anda adalah screen, maka ini tidak akan bekerja semua yang baik karena screen's -cbendera hanya menimpa nya .scrreenrc. Jadi, sebenarnya tidak ada cara untuk mengirim perintah ke layar jika itu adalah shell default Anda. Anda harus benar-benar menjalankan layar sebagai perintah yang diberikan kepada ssh, tetapi dengan shell default yang bukan layar .

Jika itu yang Anda coba lakukan, saya pikir semuanya akan menjadi sangat aneh, karena screenjuga akan menutup jendela dengan program non-interaktif, jadi Anda harus melakukan trik yang mirip dengan sirip, tetapi satu tingkat lebih dalam. SO, dengan, misalnya / bin / bash (dan bukan layar) sebagai shell default Anda Sesuatu seperti:

ssh user@host -t 'screen bash -l -c "ls;bash"'

Yang seharusnya - mengambil napas dalam-dalam - ssh ke host, jalankan bash -c dengan perintah layar, yang akan membuat jendela baru. Jika jendela ini hanya terbuka ls, itu akan berakhir, dan layar akan berakhir, jadi kami menggunakan trik fons di dalam jendela layar baru .

Saya pikir itu akan berhasil, jika itu yang Anda coba lakukan;)


Saya pikir masalah yang saya miliki dengan screensituasi ini, adalah bahwa saya biasanya memuatnya dengan exec screen -RRdari saya .profile. Ini berarti bash -lmencoba memuat layar yang membuang sisanya. sepertinya saya bisa mengatasinya dengan menghapus '-l' di kedua solusi Anda dan @fons (Anda kemudian meninggalkan saya screen). Ini agak miring.
matthew

0

Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal:

ssh -tt user@host 'bash -l -c "/path/to/command'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.