Bash prompt untuk mengubah warna ketika saya masuk ke server

15

Apakah ada cara untuk membuat bash prompt dinamis, sehingga berubah warna saat masuk ke server?

Jadi saya ingin warna seperti menjadi hijau saat di sistem saya dan berubah menjadi merah ketika terhubung ke server. Saya memiliki sejumlah besar server yang tidak ingin saya bedakan .bashrcdengan semua itu.

nitin
sumber
Mungkin tidak. Tapi kembalilah ke sana superuser.com/questions/33712/…
acak
1
Mengapa tidak membuat terminal Anda merah (atau warna lain) sehingga ketika Anda terhubung, Anda mendapatkan warna putih standar?
Pasang kembali Monica - ζ--

Jawaban:

9

Remote prompt diatur oleh remote ~/.bashrc. Jadi Anda masih perlu menyalinnya ke server jauh. Namun, Anda dapat menggunakan satu ~/.bashrcuntuk semua host, dan mengatur warna prompt berdasarkan nama host:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='\033[48;5;16m\033[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='\033[48;5;16m\033[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[\033[m\]:\w>\$ '
unset prompt_color

Catatan:

  • Jangan setel PS1jika belum disetel (mis., Jika shell tidak interaktif). Menguji jika PS1tidak kosong adalah cara yang sangat umum untuk memutuskan apakah shell itu interaktif, dan Anda tidak ingin membingungkan program yang melakukannya. (Bisa dibilang tes yang lebih akurat memeriksa apakah $-berisi i.)

  • Jika Anda ingin kode ini dijalankan saat masuk ke server jauh, Anda harus memiliki salah satu file profil yang selalu sumber ~/.bashrc. Tapi saya anggap Anda tahu itu.

  • Dalam PS1, kode pelarian harus disertakan \[...\].

  • \[033[mme-reset latar depan dan latar belakang ke default. Jadi di sini, :\wmuncul di terminal foreground / background.

  • \[033[48;5;XXXm\033[38;5;YYYmmengatur latar belakang / latar depan ke XXX/ YYY.

  • Untuk skrip yang menampilkan warna yang tersedia, coba colortest.

  • Untuk memeriksa seperti apa tampilannya:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
Matei David
sumber
7

Jika Anda tidak ingin (tidak bisa) membuat remote memiliki yang terpisah PS1, maka saya akan mengatakan "tidak", itu akan setidaknya sangat sulit. Pertimbangkan bahwa pada koneksi SSH pihak lokal tidak memiliki ide nyata tentang apa itu shell prompt dan apa yang lain, dan karenanya pengaturan warna untuk prompt benar-benar harus datang dari jarak jauh. Anda dapat mengatur warna sebelum memulai sesi, tetapi mereka akan efektif untuk semua output, yaitu sampai seorang lsatau editor menetapkan warna sendiri.

Tentu saja Anda dapat membuat beberapa pembungkus untuk sesi untuk mendeteksi segala sesuatu yang tampak seperti prompt dan untuk mewarnainya, tetapi itu akan dengan mudah mengarah ke positif palsu (warna pada setiap baris dengan $?) Dan menjadi sangat rumit dibandingkan dengan hanya menjatuhkan sebuah satu baris ke Anda .profileatau .bashrcdi setiap mesin.

Dengan sejumlah mesin, mungkin ada gunanya mencari solusi untuk menyinkronkan perubahan konfigurasi pada mereka semua. Baik itu alat yang dibuat untuk itu, atau hanya sebuah skrip, atau hanya menjalankan loop untuk menyalin (set) file konfigurasi pada semuanya.

ilkkachu
sumber
2
Paragraf terakhir adalah kuncinya. Jika OP mengelola "sejumlah besar server" itu mengherankan bahwa masing-masing harus dikonfigurasi secara individual di tempat pertama.
Lightness Races dengan Monica
5

Saya menggunakan skrip wrapper dengan sshpass yang pertama-tama akan mengunggah profil sementara dan kemudian ssh menggunakan profil ini (dan menghapus file temp).

Dua hal utama dari naskah ini adalah:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Dengan ini, Anda dapat dengan mudah menentukan warna sesi jarak jauh.

Saya tahu ini tidak langsung menjawab pertanyaan Anda, tetapi bisa digunakan untuk menyelesaikannya.

Mikael Kjær
sumber
3
Jangan gunakan sshpass -pjika memungkinkan! Argumen baris perintah untuk menjalankan program biasanya dapat dilihat oleh semua pengguna di dalamnya ps, dan karenanya akan menjadi kata sandi. Bahkan jika Anda tidak memiliki akun pengguna lain di mesin, Anda dapat mencetaknya di layar secara tidak sengaja. sshpassdapat membaca kata sandi dari variabel lingkungan, yang tidak terlalu sulit untuk digunakan. Juga, pertimbangkan kunci ssh jika Anda akan menyimpan kredensial login ke file.
ilkkachu
Anda benar dan saya tidak berusaha mempromosikan penggunaannya. Saya hanya menempelkan sebagai contoh dari skrip saya yang hanya digunakan untuk tujuan pengembangan dan tidak memberikan risiko keamanan. Variabel SSHPASS akan dibiarkan kosong untuk sistem produksi di mana kunci ssh digunakan. Saya akan memperbarui.
Mikael Kjær
1

Anda mungkin tertarik context-color, yang telah saya kumpulkan untuk tujuan yang tepat: https://github.com/ramnes/context-color

Ini adalah skrip sederhana yang, ketika dijalankan, mengeluarkan warna berdasarkan hash keluaran perintah. Dengan itu diinstal di suatu tempat di Anda $PATH, Anda dapat melakukan sesuatu seperti ini di .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(di mana --prompt/-psakelar sehingga warna lolos untuk meminta, dan \[\e[0m\]urutan pelarian untuk mengatur ulang warna)

Secara default, perintah yang digunakan untuk menghasilkan hash adalah whoami; hostname. Jika Anda hanya ingin warna berubah sesuai dengan nama host, Anda dapat mengubah $CONTEXTlingkungan variabel ( export CONTEXT="hostname") atau cukup gunakan --context/-copsi ( context-color -c "hostname").

Lihat di bawah untuk contoh:

demo

ramnes
sumber