Etkileşimli olmayan bir giriş kabuğu olması mümkün müdür?


11

Yorumlanmasında bu akış

resim açıklamasını buraya girin

Bunu adam bashında buldum:

Bash etkileşimli bir giriş kabuğu veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında, dosya varsa / etc / profilinden komutları okur ve yürütür.

Etkileşimli giriş kabuklarının okunduğunu belirtir /etc/profile(--noprofile olmadan)

Ayrıca, okuma seçeneği ile etkileşimli olmayan kabuklar--login/etc/profile

Yani bazı olası bırakmak gibi görünüyor giriş kabukları (hangi $0bir ile başlar -) olmak o etkileşimli olmayan (belki olarak basit gibi bir komut dosyasını çalıştırın date) okumamış olabilir (kaynak) /etc/profile.

Bu fikri onaylamak veya reddetmek için:

İlk olarak, ilk karakter olarak su -l -bir giriş kabuğu ile başlayan bir giriş kabuğu kullanmaya çalıştım , -ancak etkileşimli hale getiremiyorum (ve test etmek için testleri sunabiliyorum).

Gibi bir şey çağırmak

$ bash -c 'date' -bash

Bir giriş kabuğu olduğunu bildirmez (ilk karakter a olsa bile -).

Ayrıntıları ortaya çıkarmak için bunu deneyin:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0Bir sahiptir -ilk karakter olarak, hiçbir orada ideğerinde (interaktif) $-ama bir olarak rapor edilmez login_shell(-u). Bu durumda, / etc / profile okunmadı, ancak bunun doğru test olduğundan emin değilim.


Ayrıca, bu soru için yeterince spesifik olmadan bu cevapta "nadir etkileşimli olmayan giriş kabuklarından" bahsedilmektedir .


Bu adam sonuç olduğunu /etc/profilehep okunur.

Özet tablosunu okuyun: hem etkileşimli hem de etkileşimli olmayan giriş kabukları okunur /etc/profile


Ve, bu sayfadaki örnekler doğruysa:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

Okunan exec su - bob -c 'env'raporların testi /etc/profile.


Kısacası:

Etkileşimli olmayan bir giriş kabuğuna sahip olmak mümkün mü (--login veya -l ile çağrılmaz)?

Ve eğer doğruysa, /etc/profiledosyayı okuyor mu?

Yukarıdakiler doğruysa, TÜM giriş kabuklarının [etkileşimli (veya değil)] okuma / etc / profilini (seçeneksiz) sonucuna varmalıyız --noprofile.

Not: / etc / profile öğesinin okunduğunu algılamak için dosyanın en başına şu komutu ekleyin:

echo "'/etc/profile' is being read"

Yanıtlar:


2

Etkileşimli olmayan bir giriş kabuğu olağandışı ancak mümkün. Kabuğu sıfır ile başlayan bir argümanla (normalde çalıştırılabilir dosyanın adıdır) a ile başlayan bir dizeye ayarlarsanız -, etkileşimli olsun ya da olmasın bir giriş kabuğu olur.

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

Denemeniz bash -c date -bashişe yaramadı çünkü bu, kabuğa bir giriş kabuğu olduğunu söylemiyor: sıfırıncı argüman bashdeğil -bash. Bash başladıktan sonra, değişken setleri $0için -bashyerine sıfırıncı argümanının ama sıfırıncı argüman önemli olan.

Etkileşimli olmayan bir giriş kabuğu su -lveya ile çalıştırabilirsiniz su -, ancak yine de yetkilendirilmeye devam ederken (bir parola yazmak zorunda kalmadan veya parolanızın başlangıcında olması için düzenleme yapmadan standart girişin terminal olmamasını ayarlamanız gerekir. giriş). Durum sudo truebilgisi almak için sudo: run ile daha kolay olabilir echo 'shopt -p login_shell; echo $-' | sudo -i.

Ayrıca bkz. Giriş Kabuğu ile Giriş Yapmayan Kabuk arasındaki fark?


4

Grafik giriş ortamlarını gördüm:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

veya şuna eşdeğer:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

Böylece oturum başlatma dosyası ( ~/.profileBourne benzeri kabuklar (ve /etcbazıları için karşılık gelen olanlar için) gibi) okunup uygulanır.

İlki tüm mermilerle çalışmaz. -lçok sayıda kabuk tarafından desteklenir, ancak hepsi değil ve csh/ gibi bazılarında tcshkullanılamaz -c. İlk karakteri argv[0]varlığa -ne anlama yıllardan olarak, gerçi bütün kabuklar tarafından anlaşılır loginonlar giriş kabukları olan kabukları anlatmak için kullanır.

İkinci durumda, bu kabuğun stdin'i bir ttycihazdan başka bir şeydir ( <<geçici bir düzenli dosya veya kabuğa bağlı bir boru ile uygulanır), bu nedenle kabuk etkileşimli değildir (bir insan etkileşime girdiğinde etkileşimli varlık tanımı Bununla birlikte).


İlki --loginseçeneği kullanıyor . İkincisi için, eğer exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"alırsam (C qoutes kodlanmış) $'/etc/profile read\nshopt -s login_shell\nbash himBH'bu yüzden, bu giriş ama interaktif. Giriş yapmamız ve etkileşimli olmamamız gerekiyor . Kaçırdığım şey nedir?

@sorontar ile <<<"$-"o, $-çünkü çift tırnak çağıran kabuk tarafından genişletilir. Denilen kabuk etkileşimli değildir çünkü stdin bir tty değildir.
Stéphane Chazelas

Ah, evet, haklısın efendim. Ancak, hatayı düzelterek bunu yapabiliriz: exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFbu onayı almak için: $'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'Evet, evet, etkileşimli olmayan bir giriş kabuğu mümkündür ve hala okunmaktadır /etc/profile. TÜM giriş kabuklarının okuduğu sonucuna varmalı mıyız /etc/profile?

ksh, etkileşimli olmayan bir giriş kabuğu olduğunu açıkça ortaya koyuyor , deneyin exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF:).

1
@sorontar, çoğu kabuk uygulamasının giriş kabukları olarak adlandırıldığında oturum başlatma dosya (lar) ını okumasını beklediğinizi düşünüyorum. Bunların hangisi kabuk uygulamasına ve sürümüne bağlıdır. Durumunda bash, başlangıç dosyası işleme oldukça berbat edilir IMO, bazı sistemler daha varyasyon eklendiğinde daha makul bir davranış olması bunu yamalı olduğunu göreceksiniz.
Stéphane Chazelas

3

Evet, etkileşimli olmayan giriş kabukları mümkündür

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

Yani basitleştirilmiş bu benzer: su -c 'echo hello' -. : İhtiyacımız olanı test etmek Ki, gibi yazılmalıdır su -c 'echo $0 $-; shopt -p login_shell' -(C tırnak içinde kodlanmış) bu teyit cevap almak için: $'/etc/profile read \n -su hBc \n shopt -s login_shell'. Bu, bir giriş etkileşimli olmayan kabuğun çıkarıldığını ve işlem sırasında / etc / profile'nin okunduğunu doğrular . Teşekkürler.

0

Etkileşimli olmayan bir giriş kabuğuna sahip olmak mümkün mü (--login veya -l ile çağrılmaz)?

EVET.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

Ancak, bağımsız değişken /etc/profileverilmedikçe etkileşimsiz bir giriş kabuğu için kullanılmayacağını unutmayın --login.

Etkileşimli olmayan bir giriş kabuğunu çağıran ortak bir deyim:

$ su - someuser -c somecommand

Ama bu /etc/profileidam edilmemesi gerçeğini çekiyor .

Bu davranışı değiştirmek mümkündür ancak config-top.h dosyasında bulunan bir seçeneği kaldırarak Bash kaynak kodunu derleme zamanında özelleştirmeyi içerir :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

Ben ne zaman bu araştırılmış suanomali , bunu diğer kabuklar dahil buldum zshve dashbu çelişkiyi yok.

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.