ssh, mulai shell tertentu, dan jalankan perintah pada mesin remote?

11

Saya berada dalam situasi di mana beberapa pengguna berbagi akun pengguna yang sama di mesin jarak jauh. Saya memiliki direktori "pribadi" tempat saya menulis .zshrcfile saya sendiri , dan saya ingin memiliki cara untuk:

  1. Mulai sesi ssh di mesin jarak jauh dengan arahan dari file konfigurasi ssh saya (mis. ControlMaster auto)
  2. Sesi ini menjalankan shell Z
  3. Ini menjalankan .zshrcdirektori "pribadi" saya (bukan pada direktori home pengguna bersama)

Akan menyenangkan untuk memiliki alias atau cara sederhana untuk memulai sesi ssh seperti itu (itu sebabnya saya berpikir untuk menggunakan file konfigurasi OpenSSH), tetapi saya terbuka untuk ide lain!

Menggunakan file konfigurasi OpenSSH?

Saya membaca pada halaman manual ssh_config OpenSSH yang dapat saya gunakan direktif LocalCommanduntuk menentukan perintah yang akan dijalankan secara lokal setelah berhasil terhubung ke server. Ini membuat saya berpikir mungkin ada cara untuk memberi tahu configfile perintah apa yang harus dijalankan dari jarak jauh setelah terhubung ke server, tetapi sepertinya tidak ada.

Amelio Vazquez-Reina
sumber
Saya pikir Anda tidak bisa. Tapi saya bingung mengapa Anda menginginkan ini. Sudah ada perintah di baris perintah ssh. Kenapa kamu tidak bisa lari ssh mycommand? Dan jika Anda ingin menjalankan beberapa perintah pengaturan sebelum setiap perintah yang datang ssh, mengapa tidak mengkonfigurasi sisi server?
Gilles 'SO- stop being evil'
Terima kasih @Guilles. Saya berada dalam situasi di mana banyak pengguna berbagi akun jarak jauh yang sama, jadi saya ingin dengan cepat mengatur beberapa hal saat saya masuk secara jarak jauh. Lebih khusus, saya ingin memulai shell Z dan memintanya untuk menjalankan .zshrcdi direktori tertentu (yaitu direktori home "pribadi"). Saya mencoba ssh -t host_name 'zsh & source /path/to/my_zshrc'tetapi tidak berhasil (saya dapat FPATH variable not defined, dan saya pikir itu karena zshselesai sebelum berjalan my_zshrc, apalagi ini tidak memberi saya shell Z)
Amelio Vazquez-Reina
Saya pikir ini layak mendapat pembaruan OP, jadi saya baru saja memperbaruinya.
Amelio Vazquez-Reina
Setelah mencari jawaban yang mirip dengan saya, terpikir oleh saya bahwa pertanyaan ini cukup dekat dengan apa yang Anda coba lakukan.
Gilles 'SO- stop being evil'

Jawaban:

15

Cara paling jelas untuk menjalankan perintah dari jauh adalah dengan menentukannya di baris perintah ssh. Perintah ssh selalu ditafsirkan oleh shell pengguna jarak jauh.

ssh [email protected] '. ~/.profile; command_that_needs_environment_variables'
ssh -t [email protected] '. ~/.profile; exec zsh'

Akun bersama pada umumnya adalah ide yang buruk; jika memungkinkan, dapatkan akun terpisah untuk setiap pengguna. Jika Anda terjebak dengan akun bersama, Anda dapat membuat alias:

ssh -t [email protected] 'HOME=~/bob; . ~/.profile; exec zsh'

Jika Anda menggunakan otentikasi kunci publik (lagi, disarankan), Anda dapat menentukan perintah per-kunci di ~/.ssh/authorized_keys. Lihat jawaban ini untuk penjelasan lebih lanjut. Edit baris untuk kunci Anda di ~/.ssh/authorized_keysserver (semua dalam satu baris):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== [email protected]
Gilles 'SANGAT berhenti menjadi jahat'
sumber
@Guilles fantastis. Kontribusi Anda ke situs ini menjadikannya sumber daya yang sangat berguna bagi kita semua. Terima kasih banyak, sungguh. Omong-omong, saya tidak tahu tentang execperintah itu. Apa exec zshbedanya menelepon zshsecara langsung? Mengapa ini penting dalam kasus khusus ini?
Amelio Vazquez-Reina
Hmm, ketika saya berlari ssh -t [email protected] 'HOME=~/bob; exec zsh'saya mengerti HOME=~/bob: command not found. Saya pikir saya aktif tcsh. Saya mendapatkan masalah yang sama jika saya mencoba HOME=/home/bob. Saya mencoba bash dan zsh. Adakah petunjuk apa yang menyebabkan hal ini? Akhirnya, akankah sintaks di atas membiarkan saya dengan sesi ssh terbuka? (apa yang saya inginkan). Terima kasih lagi.
Amelio Vazquez-Reina
1
@ intrpc execmenggantikan shell asli dengan zsh; tanpa zsh, cangkang asli akan tetap berada dalam memori sampai zsh keluar dan kemudian keluar. Perbedaan utama adalah menghemat sedikit memori, itu tidak terlalu penting. Jika shell login Anda adalah (t) csh, gunakan setenv HOME ~/bob; exec zsh. Akhirnya, karena zsh dimulai tanpa argumen, Anda mendapatkan sesi shell, seperti yang Anda dapatkan jika Anda hanya berlari sshdan menjadikan zsh sebagai shell login Anda.
Gilles 'SO- stop being evil'
Sekali lagi terima kasih atas bantuan Anda. Satu pertanyaan lanjutan di sini. Adakah cara untuk menjalankan lebih banyak perintah, setelah exec zshperintah?
Amelio Vazquez-Reina
1
@ AmelioVazquez-Reina Tidak nyaman kecuali Anda memiliki kontrol atas salah satu file dot. Anda dapat mengatur variabel lingkungan ZDOTDIRuntuk membuat zsh mencari file dot di direktori yang berbeda. Jika Anda memiliki beberapa kontrol atas file dot maka Anda dapat melakukan sesuatu seperti add eval $LC_STARTUP_CODEke $ZDOTDIR/.zshrcdan lulus kode untuk mengeksekusi dalam variabel lingkungan LC_STARTUP_CODE.
Gilles 'SO- stop being evil'
-3

Untuk menjalankan perintah dari jarak jauh setelah menghubungkan server, tambahkan file .ssh / config Anda dengan potongan berikut

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
parth115
sumber
2
Terima kasih @ user626129, tetapi seperti yang saya sebutkan dalam pertanyaan asli LocalCommandarahannya adalah menjalankan perintah pada shell lokal , bukan pada shell remote .
Amelio Vazquez-Reina