Biasanya, jika Anda memberikan perintah ke ssh seperti itu
ssh [email protected] 'some-command.sh'
Anda mendapatkan sesi non-interaktif, dan ssh keluar segera setelah perintah (atau skrip, atau apa pun) dijalankan. Bagaimana saya bisa mendapatkan sesi interaktif, dan belum menjalankan perintah yang saya tentukan dari mesin lokal saya. Misalnya, saya ingin dapat membuka layar dan memulai kembali sesi layar tertentu:
ssh [email protected] 'screen -r 12345'
tetapi ini tidak diperbolehkan, mengembalikan kesalahan "Harus terhubung ke terminal." yang saya anggap berarti pada dasarnya "harus memanggil perintah ini dari shell interaktif".
Sebagai contoh lain, saya menggunakan banyak mesin di tempat kerja yang sering mengharuskan saya untuk menggunakan akun bersama untuk memiliki hak untuk melakukan hal-hal tertentu (ya saya tahu: ide buruk tapi jangan salahkan saya, saya tidak mengatur hal-hal yang cara), dan mereka biasanya memiliki ksh sebagai shell default. Saya ingin masuk, beralih ke bash (atau zsh), dan sumber .bash_profile (atau .zshrc) akun saya sendiri. Ini akan mudah jika saya bisa membuat sesi ssh interaktif dan meneruskan perintah ke mesin jarak jauh untuk dijalankan saat login.
Saya memiliki solusi yang sangat kludgey (dan belum diuji) dalam pikiran bahwa saya akan memposting, tetapi saya berharap seseorang tahu cara yang lebih baik.
PEMBARUAN: bagi mereka yang tidak menyadari hal ini, saya tidak berencana untuk melakukan semua ini dengan tangan, jadi menyuruh saya untuk membuka sesi interaktif dan kemudian melakukannya dengan tangan tidak benar-benar menyelesaikan apa pun.
PEMBARUAN KE-2: Mencoba sekali lagi untuk mengklarifikasi: Saya mencoba menjalankan perintah (sewenang-wenang) di server (ditentukan secara program pada klien) tetapi kemudian memiliki sesi interaktif terbuka yang dipengaruhi oleh apa pun yang dilakukan oleh perintah-perintah program tersebut.
echo "command" | ssh user@remote_host
Jawaban:
Anda dapat mencoba perintah berikut untuk memulai bash dan sumber profil Anda sendiri ketika Anda ssh:
sumber
-t
saklar perbaikan masalah kuesioner denganscreen
juga.ssh -t www.dev "echo 'hi there'"
, koneksi langsung ditutup setelah perintah dijalankan.Membangun berdasarkan jawaban dogbane, solusi lengkap terlihat seperti:
Di sini saya gunakan
-t
untuk memaksa alokasi pseudo-terminal, yang diperlukan untuk shell interaktif. Lalu saya menjalankan dua perintah di server: pertama hal yang ingin saya lakukan sebelum membuka shell interaktif (dalam kasus saya, mengubah direktori ke folder tertentu), dan kemudian shell interaktif itu sendiri. bash melihat bahwa ia memiliki terminal semu dan merespons secara interaktif.Kutipan tunggal memastikan semuanya diteruskan ke server jauh sebagai perintah untuk dijalankan oleh shell default Anda.
Sekali lagi terima kasih kepada dogbane untuk memberikan petunjuk yang diperlukan
-t
. Saya biasa memecahkan masalah ini denganexpect
, yang pasti membunuh tikus dengan meriam. (:sumber
Coba solusi ini.
Login bersifat interaktif dan perintah Anda diteruskan seolah-olah Anda mengetiknya di baris perintah interaktif. Sesi berakhir seolah-olah Anda telah mengetik
sumber
ssh
.-t
atau file bash Anda sendiri. +1Gunakan ssh -X untuk menggunakan termIO cmds.
Juga - Anda dapat mengaitkan cmds Anda seperti "ssh 'source ~ / .bashrc && cd && do'"
sumber
mengapa tidak menginstal detach pada sistem jarak jauh dan gunakan:
sumber
detach
,ls
tidak membuat sesi terbuka dan akan memutuskan sambungan tanpa mencetak output darils
tetapi tetap berjalan.jawaban laggingreflex sudah dekat ... Saya akan mengubahnya sebagai berikut:
Sayangnya, Anda tidak akan menyukai cara kerjanya, karena "cat" mendukung garis yang ditulisnya menjadi stdout ... Jika kita membuat skrip yang disebut "echo-cat" yang terlihat seperti ini:
kami akan mendapatkan hasil yang sama tanpa buffering:
Itu mungkin akan membuat Anda lebih dekat ke tujuan Anda ...
sumber
Ini kludgey, dan belum teruji, tetapi saya pikir itu harus berhasil.
Buat skrip bernama (misalnya) remote-starter yang mengambil argumen yang dikutip setelah argumen pengguna @ host:
Skrip ini pertama-tama harus menyimpan perintah yang dikutip (tanpa tanda kutip) dalam file bernama (misalnya)
.onetime
pada mesin remote, dan kemudian jalankan perintah ssh biasa, kali ini tidak melewati perintah apa pun untuk dijalankan di mesin jarak jauh. (Jika menjalankan ssh [email protected] dari dalam skrip, mungkin berfungsi untuk menjalankan exec ssh [email protected].)Agar ini berfungsi, mesin remote harus sumber
.onetime
dari .bash_profile atau .zshrc atau apa pun. Setelah berjalan.onetime
, seharusnya dihapus.onetime
, sehingga file tidak berjalan saat Anda melakukan login reguler.sumber