Sumber file setelah login ssh turun ke prompt

Aug 16 2020

Pertanyaan satu baris: Bagaimana cara secara otomatis mencari file jarak jauh pada host jarak jauh setelah masuk melalui SSH melalui bastion host?

Saya perlu mencari file yang berisi daftar alias + fungsi yang ditentukan pengguna shell pada host jarak jauh setelah ssh-ing ke dalamnya.

File tersebut ada di maching jarak jauh di folder / tmp misalnya / tmp / my-rc

Mencari posting dan internet lain yang saya temukan

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

Masalahnya adalah saya mendapatkan terminal, tetapi tidak ada alias yang disetel karena ini adalah bash shell baru '

Berpikir, bahwa sumber harus dilakukan setelah shell dipasang, coba di bawah ini tetapi ini juga tidak berhasil. Tidak ada kesalahan, saya mendapatkan terminal tetapi tidak berpikir file tersebut bersumber (diverifikasi dengan menggemakan pesan dummy dari / tmp / file my-rc)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

Bahkan mencoba dengan '.' bukannya sumber, tidak beruntung.

Bantuan apapun.

Note1: Bash atau ZSH solusi shell apa pun akan dilakukan.

Note2: Sebenarnya ssh adalah melalui perintah proxy yaitu hop over bastion host (Sebut saja jika relevan sama sekali)

Note3: Saya tidak memiliki hak istimewa dari rc profil atau bashrc atau bahkan direktori home pada host jarak jauh.

Note4: Perintah persis yang saya gunakan untuk masuk ke host aman adalah melalui bastion host seperti di bawah ini

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

Jawaban

4 StéphaneChazelas Sep 01 2020 at 23:09

Dengan bash, Anda dapat melakukan:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

Yang akan menyebabkan /tmp/my-rcbersumber sebelum prompt, dan hanya prompt itu karena kita membatalkan pengaturan PROMPT_COMMANDsesudahnya.

Anda akan ingin menghapus unset PROMPT_COMMANDjika /tmp/my-rcbenar-benar menentukannya.

Di atas mengasumsikan shell login dari pengguna jarak jauh seperti Bourne, tetapi Anda harus dapat menyesuaikannya dengan kebanyakan jenis shell lainnya (csh / rc / fish).

2 fra-san Sep 01 2020 at 22:30

Mengingat bahwa Anda dapat menulis ke host jarak jauh /tmp, Anda dapat membuat /tmp/myhomedirektori di dalamnya, meletakkan profil shell dan file inisialisasi di sana, lalu memulai Zsh dengan ZDOTIDRset ke /tmp/myhomedan Bash dengan HOMEset ke /tmp/myhome.

Secara default, Zsh mencari file inisialisasi di $ZDOTDIR, default ke $HOMEjika ZDOTDIRtidak diatur.

Karenanya, Anda dapat memulai Zsh pada host jarak jauh sebagai:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

Dan Bash sebagai:

ssh -t user@host HOME=/tmp/myhome bash

Tentu saja Anda dapat berkreasi dengan file profil / inisialisasi Anda — misalnya menggunakannya untuk menyetel HOMEke jalur yang lebih sesuai, mencari file lain (jika Anda kebetulan sudah memiliki file titik di suatu tempat di host jarak jauh), dll.

Aplikasi minimal dari pendekatan ini, diringkas dalam satu perintah, dapat berupa:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(Gunakan mkdir -p ...untuk mencegah kesalahan ditampilkan ketika /tmp/myhomesudah ada, misalnya jika Anda menghubungkan kembali ke host jarak jauh dan Anda sudah tahu direktori itu ada).

Mempertimbangkan Anda ProxyCommand, mungkin saja:

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

Terakhir, tentang upaya Anda: ssh -t [email protected] 'bash -l; source /tmp/my-rc'tidak berfungsi karena sourceperintah hanya dijalankan setelah shell interaktif keluar.

1 jakethefinn Sep 04 2020 at 19:40

Jika UsePAM disetel ke yes dalam file sshd_config host jarak jauh, maka file konfigurasi /etc/pam.d/sshd memungkinkan Anda untuk mengotomatiskan eksekusi perintah setelah login berhasil, di antara peristiwa lain dalam proses otentikasi. Tambahkan baris kode ini

session    required     pam_exec.so /etc/myscripts/./sourcing-script

tepat di atas garis ini

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

di mana / etc / myscripts / sourcing-script adalah file pada host jarak jauh dengan perintah untuk dieksekusi setelah login berhasil.

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

Saya menggunakan metode ini untuk menghentikan layanan dan melaporkannya ke file log, sebelum sesi ssh saya dibuka. Sebelum saya keluar, saya menetapkan crontab untuk memulai layanan, jadi tidak pernah berjalan paralel dengan sesi ssh saya.

dirkt Aug 16 2020 at 13:40

Biasanya Anda melakukan ini dalam $HOME/.profileatau varian.

sshmenetapkan variabel lingkungan yang dimulai dengan SSH_, Anda dapat menggunakannya untuk menentukan apakah Anda masuk melalui ssh, atau secara langsung.