Saat ini saya sedang menyiapkan konfigurasi bash yang cukup kompleks yang harus digunakan pada banyak mesin. Saya mencoba mencari tahu apakah mungkin untuk menentukan apakah saya masuk melalui SSH atau pada mesin lokal. Dengan cara ini saya bisa, misalnya, menetapkan beberapa alias tergantung pada fakta itu. Seperti aliasing halt
untuk restart
sejak berhenti server jauh mungkin bukan hal terbaik untuk dilakukan.
Yang saya tahu sejauh ini adalah, bahwa variabel lingkungan SSH_CLIENT
diatur ketika saya masuk melalui ssh. Sayangnya, variabel ini dibuang ketika saya memulai shell pengguna super sudo -s
. Saya juga tahu bahwa saya bisa mengirimkan parameter ke sudo yang memerintahkan sudo untuk menyalin semua variabel lingkungan saya ke lingkungan shell baru, tetapi jika saya tidak ingin melakukan ini, apakah ada cara lain?
ps afx
dan TTY untuk shell tidak berjalanps
akan menjadi login lainnya.who am i
.who am i
, sehingga Anda dapat menentukan dari sana apakah Anda SSHing atau tidak. Ini bekerja:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
dua argumen tambahan apa pun.who am i
sama denganwho is me
atauwho is awesome
atauwho potato potato
. Sebuah fakta yang saya temukan sedikit menarik.Inilah jawaban yang bagus yang saya temukan di unix.stackexchange :
SSH_CLIENT
atauSSH_TTY
didefinisikan, ini adalah sesi ssh.ps -o comm= -p $PPID
. Jika yasshd
, ini adalah sesi ssh.sumber
Anda dapat menambahkan
SSH_*
keenv_keep
dalamsudoers
sehingga ini dapat dideteksi saat beralih ke pengguna lain.sumber
Jika Anda ingin tahu apakah Anda bash shell secara langsung merupakan proses anak dari sshd (tidak dalam> 1 lapisan) Anda dapat
itu akan memberi Anda
sshd
atau apa pun nama proses induk dari shell Anda saat ini.sumber
ps -o cmd= $PPID
atauawk '/^Name:/ {print $2}' /proc/$PPID/status
Saya pikir Anda ingin memikirkan kembali cara Anda memikirkan masalahnya. Pertanyaannya bukan "apakah saya masuk melalui SSH, karena saya ingin mematikan perintah tertentu." "Saya masuk di konsol, karena dengan begitu saya akan mengaktifkan perintah tertentu."
sumber
Ya, seperti yang dicatat orang lain, info ada di hadapan IP Anda dalam tanda kurung di output
who am i
.Anda dapat menggunakan ekspresi reguler Bash untuk mendeteksinya:
sumber
Saya datang dengan yang berikut, berdasarkan tips dari orang lain di sini.
Ini menggunakan variabel untuk caching - Saya menggunakannya dalam tema shell saya.
Sumber:
is_ssh
di https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .sumber
Cari cmdline induk dan perulangan Anda. Mungkin sesuatu seperti yang berikut ini:
Diedit agar benar-benar berfungsi :)
sumber
Semua jawaban lain berfungsi jika Anda berada di tingkat login pertama. Tetapi jika, setelah login, Anda menjalankan 'su' atau 'sudo' (dalam kasus saya, untuk beralih ke akun pengguna tanpa shell untuk alasan keamanan, saya harus menjalankan: sudo su - <userid> -s / bin / bash - l) , solusi mereka gagal.
Mengikuti adalah solusi universal; menggunakan pstree, Anda memeriksa sshd sebagai orang tua.
Ini adalah output dari egrep, ketika --quiet dihapus. Ini menunjukkan seluruh hierarki yang cocok jika seseorang terhubung dari jarak jauh.
sumber
Harap diingat bahwa jawaban ini sangat, sangat spesifik untuk Linux.
Ini membuat asumsi kunci: proses login tidak akan memiliki TTY yang mengontrol; Anda mungkin ingin memeriksa apakah Anda memiliki TTY yang mengendalikan sebelum menjalankan kode ini (yang, berdasarkan pada kebutuhan Anda, mungkin merupakan taruhan yang aman, toh).
Kode iterates ke atas melalui pohon proses, sampai menemukan proses yang tidak mengendalikan TTY.
$initiator_name
akan menjadi nama proses ini ("sshd", misalnya).sumber