sysadmin değiştirmeme izin vermediğinde giriş kabuğum olarak bash'ı nasıl kullanabilirim


38

Çalışıyorum unix sistem yöneticisi benim giriş kabuğu değiştirmek için bana erişim vermek konusunda isteksiz olduğunu kshiçin bash. Çeşitli mazeretler verdi, en komik olanı, kshonları çalıştırmayı denersem çalışamayacakları için tüm senaryolarını yazdıkları için. Bu fikirleri nereden edindiğini bilmiyorum, ama onu ikna edemediğimden, sahip olduğum başka bir alternatif var mı?

( chshbu makinelere yüklenmiştir, ancak oturum açmak için genel / özel keypairs kullanıyoruz ve hiçbir şifrem yok, bu yüzden chshbir şifre sorduğumda vereceğim hiçbir şeyim yok.)

Yanıtlar:


69

Giriş yaptığınızda, dosya ~/.profilegiriş kabuğu tarafından okunur (sizin için ksh). Bu oturum açma kabuğuna kendisini bash ile değiştirmesi talimatını verebilirsiniz. Bazı önlemler almalısınız:

  • Giriş kabuğunu ancak etkileşimli ise değiştirin. Bu önemlidir: Aksi takdirde, grafik modunda oturum açmak işe yaramayabilir (bu sisteme bağımlıdır: bazıları ancak ~/.profilexdm veya benzeri bir oturumla girerken okunan sistemlerin tümü değildir ) ve bunun gibi ifadeler ssh foo '. ~/.profile; mycommand'başarısız olacaktır.
  • Bash'ın uygun olup olmadığını kontrol edin, böylece yürütülebilir dosya bir nedene sahip değilse hala giriş yapabilirsiniz.

Bash'i bir giriş kabuğu olarak çalıştırıp çalıştırmamayı seçme şansın var. Bir giriş kabuğu yapmanın tek büyük farkı, yükleyeceği ~/.bash_profileveya ~/.profile. Eğer bash'i giriş kabuğu ~/.bash_profileolarak çalıştırıyorsanız, bash'i yinelemeli olarak çalıştırmamaya dikkat edin veya dikkatli olun ~/.profile. ~/.profileKsh yerine bash ile gerçekleştirilmenin gerçek bir avantajı yoktur , bu yüzden yapmamayı tavsiye ederim.

Ayrıca SHELLortam değişkenini bash olarak ayarlayın, böylece terminal emülatörleri gibi programlar bu kabuğu çağırır.

İşte bash'a geçiş kodu. Sonuna koy ~/.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

17
Mükemmel cevap! stackexchange'in Bira Gönder düğmesine ihtiyacı var: bu kullandığım zaman olurdu.
iconoclast,

İlk önce teşekkürler. .profilesadece giriş kabuğu için çalışır (OP ihtiyacı olarak). Bir Linux iş istasyonuna giriş yapmak için Windows 10 Uzak Masaüstü Bağlantısı'nı kullanıyorum, ardından Terminal'i gnome'da açıyorum. İstediğim zshbenim sistem yöneticisi bana verirken bash. Bu durumda, pasajı .bashrcyerine eklemek zorundayım .profile.
Hafta sonu

12

Bu biraz kludgey, ancak bashgiriş .profiledizininde bir dosya oluşturarak giriş yaparken kullandığınız kabuk olabilir .

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

Bu, kshoturumun bir bashoturumla değiştirilmesine neden olur . Her oturum açtığınızda el ile yeni bir oturum başlattıysanız, yazdığınız gibi iki kez exit(veya ^D) yazmak zorunda kalmazsınız bash.

echo $SHELL

hatta yolunu döndürür bash.


3
Tabii ki $ SHELL 'i çalıştırmadan önce bir satır ekleyerek kolayca değiştirebilirsiniz.
derobert,

2
Yeni kabuğun ayrıca bir giriş kabuğu olmasını istiyorsanız, muhtemelen yapmanız gerekir exec bash -l.
jw013

1
Son bir açıklama: typeedilir tavsiye üzerine which.
jw013

1
Anlamadım! Olmaz bashda okumak .profilesonsuz döngü üreten böylece? Satırları boyunca bir şey exec bashistediğiniz ne olduğunu kabul ediyorum , ancak bunu sadece giriş ksh için yaptığınızdan emin olmak gerekir, bu yüzden bazı if-ifadeleri gerekli!
Bananguin

1
@ user1129682 yoksa ~/.bash_profileveya~/.bash_login
Ulrich Dangel

4

Giles'in cevabı bash yürütülürken -l bayrağı eklenmeli, böylece herhangi bir giriş profili komut dosyası yeni bash kabuğuna kaynaklanacak. (Örneğin, RHEL'deki /etc/profile.d/ içindeki herhangi bir şey). Betik daha sonra olmalı:

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

Neden -lseçenek eklemek istediğinizi açıklayabilir misiniz ? Bunu aylarca, sorunsuz olarak kullanıyorum.
cokedude

1

csh/tcshBirinin @Gilles tarafından oylananlardan esinlendiği bir cevap

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.