Atur $ PS1 secara berbeda di komputer lokal dan di sesi ssh


9

Saya menyimpan direktori home saya di bawah kontrol versi, sehingga konfigurasi dasar saya mudah tersedia di komputer mana pun.

Prompt perintah bash saya di komputer lokal saya adalah hal yang rumit dan penuh warna yang mencakup repositori git saat ini dan kondisinya. Tapi saya lebih suka memiliki user@host ~ $command prompt sederhana ketika saya sshmasuk ke mesin remote.

Saya ingin dapat memperbarui saya .profilesehingga membuat rumit $PS1ketika berjalan secara lokal dan yang disederhanakan ketika berjalan dalam suatu sshsesi.

Pada dasarnya, saya ingin sesuatu seperti $AM_I_LOGGED_IN_VIA_SSHvariabel untuk diuji di .profile. Apakah itu mungkin?

Jawaban:


8

Saat Anda masuk melalui SSH, beberapa variabel lingkungan tambahan diatur. Anda bisa menggunakan ini sebagai tes untuk mengatur PS1 Anda di. Profil Anda.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

7

Jika Anda memeriksa lingkungan Anda ( env | grep SSH) Anda akan menemukan beberapa kandidat seperti $SSH_CLIENT, $SSH_CONNECTION, dan $SSH_TTY; daftar persisnya tergantung pada sshdversi.


2

Jika sshd Anda tidak menyediakan variabel yang berguna, Anda bisa menggunakan

ps -p $PPID

atau trik ps random acak lainnya (jika shell Anda tidak disetel $PPID) untuk melihat apakah proses induk shell adalah proses login-jauh Anda atau tidak. Lalu jika parent-is-remote-thingie ganti $ PS1. Dan kemudian unduh OpenSSH dan gunakan saran geekosaur / Caleb karena server ssh Anda adalah sampah. ;)

Atau, Anda dapat menggunakan output "who am i", ambil kolom terakhir (yaitu, $( who am i | awk '$0=$NF')), dan periksa untuk melihat apakah host adalah remote atau lokal untuk memutuskan apakah Anda login secara lokal atau jarak jauh.

Atau Anda dapat mengaktifkan output $(hostname)agar shell Anda menggunakan $ PS1 yang sesuai pada host tertentu.

Atau, mari kita benar-benar menjadi gila. Jika Anda menggunakan shell modern - seperti bash, ksh93, atau zsh, Anda dapat mengambil keuntungan dari kenyataan bahwa $ PS1 dievaluasi ulang saat dieksekusi. Jadi, Anda bisa menyertakan blok bersyarat inline untuk melakukan hal-hal gila jika cwd Anda berada di dalam repositori, dan sesuatu yang lain di luar. Sebagai contoh, di sini saya membuat perubahan prompt saya tergantung pada direktori saya menggunakan [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), pada dasarnya.

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

Tentu, definisi $ PS1 akan terlihat gila di profil Anda, tetapi Anda kemudian hanya mendapatkan hal-hal git yang sangat berwarna ketika Anda benar-benar berada di repositori git, sementara Anda memiliki warna biasa di tempat lain. :) Perhatikan bahwa Anda harus menggunakan tanda kutip tunggal di sekitar tugas PS1. Anda tidak ingin variabel diperluas ketika PS1 ditugaskan; Anda ingin mereka diperluas ketika $ PS1 dievaluasi nanti. Jadi, kutip tunggal.


1

Jika PermitUserEnvironmentdiaktifkan di sshd maka Anda dapat menggunakan ~/.ssh/environmentuntuk membuat $PS1dan kemudian hanya mendeteksi keberadaan nilai dalam skrip Anda yang biasanya menetapkannya.


0

Sebagai tambahan untuk jawaban Ignacio, untuk memperjelas, PermitUSerEnvironmentopsi harus diaktifkan di sisi server agar ini berfungsi. Jika server tidak mengaktifkan opsi ini, Anda tidak akan memiliki sesi ssh berwarna-warni dengan server itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.