bagaimana saya bisa menggunakan bash sebagai shell login saya ketika sysadmin saya menolak untuk membiarkan saya mengubahnya

38

Sysadmin unix tempat saya bekerja enggan memberi saya akses untuk mengubah shell login saya dari kshmenjadi bash. Dia telah memberikan berbagai alasan, yang paling lucu adalah karena mereka menulis semua skrip kshmereka karena mereka tidak akan berfungsi jika saya mencoba menjalankannya. Saya tidak tahu dari mana dia mendapatkan ide-ide ini, tetapi karena saya tidak dapat meyakinkannya, apakah ada alternatif lain yang saya miliki?

( chshdiinstal pada mesin ini, tetapi kami menggunakan keypairs publik / pribadi untuk masuk, dan saya tidak memiliki kata sandi, jadi ketika chshmeminta saya untuk kata sandi saya tidak punya apa-apa untuk diberikan.)

iconoclast
sumber

Jawaban:

69

Saat Anda masuk, file tersebut ~/.profile dibaca oleh shell login (ksh untuk Anda). Anda dapat menginstruksikan shell login untuk menggantinya dengan bash. Anda harus mengambil beberapa tindakan pencegahan:

  • Ganti shell login hanya jika interaktif. Ini penting: jika tidak, masuk dalam mode grafis mungkin tidak berfungsi (ini tergantung pada sistem: beberapa tetapi tidak semua sistem membaca~/.profile saat masuk melalui xdm atau serupa), dan idiom seperti ssh foo '. ~/.profile; mycommand'akan gagal.
  • Periksa bash yang tersedia, sehingga Anda masih bisa masuk jika eksekusi tidak ada karena alasan tertentu.

Anda punya pilihan apakah menjalankan bash sebagai shell login atau tidak. Satu-satunya perbedaan utama dalam membuatnya menjadi shell login adalah ia akan memuat ~/.bash_profileatau ~/.profile. Jadi, jika Anda menjalankan bash sebagai shell login, berhati-hatilah untuk memiliki ~/.bash_profileatau berhati-hatilah agar tidak menjalankan bash secara rekursif ~/.profile. Tidak ada keuntungan nyata dari ~/.profiledieksekusi oleh bash daripada ksh, jadi saya sarankan tidak melakukannya.

Juga atur SHELL variabel lingkungan ke bash, sehingga program seperti emulator terminal akan memanggil shell itu.

Berikut kode untuk beralih ke bash. Letakkan di akhir ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac
Gilles 'SANGAT berhenti menjadi jahat'
sumber
17
Jawaban yang sangat bagus! stackexchange memerlukan tombol Kirim Bir : ini akan menjadi waktu saya akan menggunakannya.
iconoclast
Terima kasih dulu dan. .profilehanya berfungsi untuk shell login (sesuai kebutuhan OP). Saya menggunakan Remote Desktop Connection Windows 10 untuk masuk ke workstation Linux, kemudian buka Terminal di gnome. Saya ingin zshsementara sysadmin saya memberi saya bash. Dalam hal ini, saya harus menambahkan cuplikan .bashrcsebagai ganti .profile.
Akhir pekan
12

Ini sedikit kotor, tetapi Anda bisa bashmenjadi shell yang Anda gunakan saat login dengan membuat .profilefile di direktori home Anda, yang mengandung

SHELL=`type -P bash`
exec bash -l

Ini akan menyebabkan kshsesi diganti dengan bashsesi. Anda tidak perlu mengetik exit(atau ^D) dua kali, seperti yang Anda lakukan jika Anda secara manual memulai bashsesi baru setiap kali Anda masuk. Dan mengetik

echo $SHELL

bahkan akan mengembalikan jalur ke bash.

iconoclast
sumber
3
Anda tentu saja dapat mengubah $ SHELL dengan cukup mudah dengan menambahkan baris untuk melakukannya sebelum eksekutif.
derobert
2
Jika Anda ingin shell baru juga menjadi shell login Anda mungkin harus exec bash -l.
jw013
1
Satu komentar terakhir: typeadalah dianjurkan lebih which.
jw013
1
Saya tidak mengerti! Tidak akan bashmembaca .profilesehingga menghasilkan loop tak terbatas? Saya setuju bahwa sesuatu sesuai dengan exec bashyang Anda inginkan, tetapi Anda harus memastikan bahwa Anda melakukannya hanya untuk login Anda ksh sehingga diperlukan beberapa pernyataan if!
Bananguin
1
@ user1129682 tidak jika ada ~/.bash_profileatau~/.bash_login
Ulrich Dangel
4

Jawaban Giles harus memiliki tanda -l yang ditambahkan ketika menjalankan bash, sehingga setiap skrip profil login akan bersumber di bash shell baru. (Misalnya apa pun di /etc/profile.d/ di RHEL). Maka skrip harus:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac
Tolle
sumber
Bisakah Anda menjelaskan mengapa Anda mengatakan untuk menambahkan -lopsi? Saya telah menggunakan ini selama berbulan-bulan tanpa itu tanpa masalah.
Cokedude
1

Jawaban untuk csh/tcshterinspirasi oleh yang terpilih teratas oleh @Gilles adalah

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif
sama
sumber
0

Solaris:

usermod -s /bin/bash root
hienbuithanh88
sumber
1
Bukankah usermod memerlukan hak admin, dan pertanyaannya adalah "... ketika admin saya menolak ..."?
Blessed Geek