Bisakah saya menjalankan beberapa perintah ketika memulai sesi ssh sebelum masuk ke mode interaktif?

13

Ketika memulai sesi ssh dengan perintah ssh, saya sepertinya memiliki dua opsi - sesi interaktif default dengan default env dan mulai dari direktori home - atau untuk mengeksekusi perintah arbitrer tetapi non-interaktif (bahkan trik seperti ssh "command; command; bash -i -l"sepertinya tidak banyak berguna). Cukup sering saya ingin sesi interaktif, tetapi dengan sesuatu yang terjadi sebelumnya - biasanya perubahan direktori, atau kadang-kadang penyesuaian lingkungan sistem. Hal-hal ini akan bervariasi dari sesi ke sesi, jadi saya tidak bisa begitu saja memasukkannya .bashrc.

Apakah ada cara untuk mewujudkannya?

taw
sumber

Jawaban:

13

Saya menjawab sendiri, karena saya akhirnya menemukan rahasianya. Tidak ada -topsi untuk ssh, maupun -lopsi untuk bashakan mengarah pada shell login sendiri - tetapi dalam kombinasi mereka berfungsi.

ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'perubahan variabel direktori, set lingkungan, dan kemudian mulai shell login yang tepat (satu-satunya perbedaan yang saya temukan sejauh ini adalah bahwa /etc/motdtidak ditampilkan dengan cara ini - itu biasanya ssh's atau login' s tanggung jawab, tidak bash's - selain itu semuanya tampak untuk bekerja dengan sempurna, dan semua variabel lingkungan identik).

Perubahan lingkungan / direktori ini terjadi setelah ssh, sehingga tidak dibatasi oleh PermitUserEnvironmentdan pengaturan terkait (persis seperti yang direncanakan), tetapi sebelum .bashrc/ .profiledijalankan. Ini memiliki kelebihan dan kekurangan - lebih sulit untuk hanya menimpa sesuatu yang akan ditetapkan dari skrip bash init seperti PS1, tetapi lebih mudah untuk mengemas nilai-nilai yang tepat ke dalam sshbaris perintah, dan .profilemelakukan semua pekerjaan berat.

Dan jika benar-benar diperlukan, sebenarnya cukup mudah untuk mendapatkan bash untuk mengeksekusi sesuatu setelah .profiledengan baris perintah seperti ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- sangat jelek ketika diletakkan seperti itu, tetapi .profilefile-file alternatif ini dapat disiapkan sebelumnya. (Sejauh yang saya tahu bashmemiliki beberapa lokasi kandidat untuk .profileskrip dan akan menjalankan yang pertama ditemukan - . filetidak memiliki cadangan otomatis seperti itu, jadi Anda harus memeriksa di mana normal profileAnda jika Anda ingin melakukannya)

taw
sumber
Luar biasa, terima kasih untuk ini! Saya mencari cara untuk memasukkan ke akun pengguna tepat setelah ssh'ing, dan opsi "-t" membuatnya berfungsi. Tanpa opsi itu, shell Anda tidak memiliki prompt, tidak memiliki riwayat perintah, mati karena SIGINT, dll.
Ashoat
Jawaban ini sangat membantu tetapi Anda kehilangan beberapa ;s dari string login ssh pertama. Itu tidak akan membiarkan saya mengedit jawaban Anda karena saya tidak cukup berubah. Saya mendapatkan ini untuk bekerja ssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Saya pikir itulah yang Anda maksudkan.
Rob Kwasowski
2

Edit .bashrc dan lampirkan pengaturan lingkungan spesifik SSH Anda di:

if [ $SSH_TTY ]; then
    ...
fi

Ini akan memungkinkan Anda untuk menambahkan pengaturan khusus untuk sesi SSH. 'Tentu saja, jika semua yang Anda inginkan adalah mengatur variabel lingkungan sewenang-wenang tepat pada permulaan yang bervariasi berdasarkan sesi, saya tidak tahu bagaimana Anda dapat membuat mesin menebak mereka untuk Anda selain mengetikkan mereka ... tidak peduli apa pun, Anda Saya akan memerlukan beberapa kondisi yang dapat diuji untuk mendasarkan pilihan pengaturan.

Michael Louis Thaler
sumber
2

Dari sshhalaman manual:

Selain itu, ssh membaca ~ / .ssh / environment, dan menambahkan baris format “VARNAME = value” ke lingkungan jika file ada dan pengguna diizinkan untuk mengubah lingkungan mereka. Untuk informasi lebih lanjut, lihat opsi PermitUserEnvironment di sshd_config (5).

yang mengatakan:

PermitUserEnvironment
Menentukan apakah ~ / .ssh / environment and environment = opsi di ~ / .ssh / berwenang_kunci diproses oleh sshd (8). Standarnya adalah "tidak". Mengaktifkan pemrosesan lingkungan dapat memungkinkan pengguna untuk melewati pembatasan akses di beberapa konfigurasi menggunakan mekanisme seperti LD_PRELOAD.

Fasilitas ini dapat digunakan untuk mengeksekusi pernyataan secara kondisional di remote Anda ~/.bashrcmenggunakan ifstruktur yang disarankan Mickey .

Dijeda sampai pemberitahuan lebih lanjut.
sumber
1

Cukup jalankan dengan cara ini: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : sehingga prompt itu akan muncul
  • ; bash: sehingga ia akan mengembalikan kontrol meskipun menjalankan perintah (di sini cd) dan keluar dari sesi ssh
Sumit Ramteke
sumber
Selamat datang di ServerFault! Harap berikan dan jelaskan dan / atau dokumentasi untuk perintah atau skrip untuk menjelaskan untuk apa itu.
Cory Knutson
1
Terima kasih @CoryKnutson, saya telah melakukan perubahan seperti yang Anda minta
Sumit Ramteke