Apakah ada shell login non-interaktif?


14

Saya tahu apa perbedaan antara shell interaktif / non-interaktif dan login / non-login, tetapi sepertinya dalam praktiknya tidak akan pernah ada shell login non-interaktif kecuali jika Anda memiliki sesuatu seperti /bin/bash --login some-script.shdalam skrip (dan bahkan yang tampaknya agak aneh). Apakah ini benar atau lebih umum?


7
telnet towel.blinkenlights.nluntuk shell login yang non-interaktif ;-)
Martin Tournoij

1
Pertanyaan ini dijawab secara singkat dalam jawaban yang lebih panjang ini .
Wildcard

@ Kapten Man: Melihat jawaban, kami memiliki dua yang berfokus pada makna "interaktif" yang sangat berbeda. Mengingat hal ini, bisakah Anda sedikit memperluas jawaban untuk menjelaskan makna mana yang Anda gunakan saat mengajukan pertanyaan?
Curt J. Sampson

Jawaban:


10

Saya berasumsi Anda sedang berbicara tentang konsep Bash tentang login vs non-login dan shell Bash interaktif vs non-interaktif seperti yang dijelaskan dalam bagian Doa dari manual. (Ini berbeda dari interpretasi dalam jawaban James Youngman tentang perintah sewenang-wenang yang digunakan sebagai "shell" (atau penerjemah perintah pengguna) dalam passwd(5)file dan apakah program itu menerima input pengguna atau tidak; beberapa, seperti /usr/sbin/nologin, jelas tidak. )

Anda benar yang /bin/bash --login some-script.shakan menghasilkan permintaan Bash login non-interaktif, dan ini mungkin merupakan contoh patologis. Ada satu kasus, mungkin jarang terjadi tetapi tidak benar-benar aneh, yang menghasilkan shell login non-interaktif: ssh somehost < some-file. Di sini sshdakan mulai Bash dengan argv[0]set ke -bashkarena itu tidak diberikan perintah untuk menjalankan, menyebabkan Bash menganggap dirinya sebagai shell login, tetapi, karena stdin tidak terhubung ke terminal, Bash tidak akan mengatur sendiri ke mode interaktif ( $-tidak akan berisi i) .

(Secara pribadi, case itu tampaknya jauh lebih masuk akal daripada yang sebaliknya,, ssh somehost somecommandyang tidak dianggap sebagai "shell login" meskipun itu adalah login somehostbaru seperti di atas.)

Baru-baru ini saya melakukan apa yang seharusnya saya lakukan sejak lama dan mengumpulkan tabel mode Bash dan file init apa yang dijalankan . Jika Anda merasa itu membingungkan, berhati-hatilah karena setidaknya saya juga melakukannya. Ini membingungkan saya apa tujuan awal mereka dengan aturan tentang kapan .bashrcdieksekusi.


1

Sebagian besar shell login dengan mengandalkan sistem yang baru diinstal bersifat non-interaktif, sebenarnya:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Jelas /bin/bashdan /bin/shtradisional kerang dan mereka interaktif. Tetapi semua item lain dalam daftar itu adalah non-interaktif. Jika Anda membaca daftar dan tidak tahu apa yang salah satu dari mereka tidak, Anda hanya dapat melihat manual page-nya (dengan misalnya man nologinatau man sync).

Apa yang sebenarnya dilakukan perintah

Melihat riwayat posting Kapten Man saya melihat bahwa mereka cukup berpengalaman dengan Unix. Jadi mungkin pertanyaan di komentar tentang tidak mengikuti terkait dengan baris perintah di bagian atas jawaban, bukan hanya output. Jadi saya akan menjelaskan baris perintah juga, meskipun itu benar-benar di luar topik untuk pertanyaan ini.

Perintahnya adalah pipa Unix . Pipeline adalah rantai perintah - Anda membacanya dari kiri ke kanan - di mana output dari perintah pertama menjadi input yang kedua, output yang kedua menjadi input yang ketiga, dan seterusnya, hingga ujung pipa. Output dari proses terakhir ditampilkan pada terminal (kecuali jika sudah diarahkan). Lihat entri Wikipedia pada pipa shell untuk informasi lebih lanjut.

Jika Anda tidak mengerti apa yang dilakukan pipa, Anda bisa menjalankannya dalam segmen untuk melihat apa yang terjadi. Anda juga dapat membaca halaman manual untuk perintah yang digunakan (di sini awk,, sortdan uniq). Bahkan, Anda harus melakukannya sekarang. Aku akan menunggu.

Mari kita jalankan tahapan pipeline secara bertahap (Anda dapat melakukannya dengan aman di sistem Unix Anda sendiri):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

Output di atas hanyalah isi dari bidang ketujuh dari /etc/passwdfile. Itu adalah basis data (flat-text-file) yang memberi tahu sistem tentang apa shell login semua orang. Jika Anda ingin mengetahui lebih lanjut tentang /etc/passwdbacalah saja (ini dapat dibaca dunia) dan lihat halaman manual untuk itu (man 5 passwd).

Jadi, bacalah seluruh daftar di sana, Anda dapat memperoleh gagasan tentang apa barang-barang populer itu, tetapi itu bukan format yang baik untuk menjawab pertanyaan ini, karena pertanyaannya sebenarnya tentang seberapa umum cangkang non-interaktif. Mari kita hitung. Cara paling sederhana untuk melakukannya adalah dengan mengurutkan item terlebih dahulu:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Kami dapat menggunakan program ini uniquntuk menunjukkan kepada kami hanya barang-barang unik:

~ $ awk -F: '{print $ 7}' </ etc / passwd | sortir | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Tapi tunggu, tidak ada gunanya, ada berapa masing-masing? Mari kita bertanya uniq(baca halaman manual!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

Tentu saja itu hasil yang kami lihat di bagian atas jawabannya. Mari kita urutkan lagi untuk melihat entri secara berurutan:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Tunggu, itu tidak mungkin benar, 17 muncul sebelum 1 dan 5 setelah 23. Masalahnya adalah bahwa item sedang diurutkan secara leksikografis . Mari kita minta sortuntuk mengurutkannya secara numerik, dan dalam urutan terbalik:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Saya pikir itu menjelaskan semuanya dalam jawaban aslinya. Jika Anda masih tidak jelas tentang rincian apa yang dilakukan perintah-perintah itu, Anda dapat membaca halaman manual. Jika Anda masih tidak jelas pada prinsip-prinsip apa yang terjadi, mungkin lebih baik untuk memulai dengan membaca buku (online atau di atas kertas) yang menjelaskan Unix dan Linux.


Bisakah Anda jelaskan lebih banyak? Saya tidak yakin mengikuti apa yang saya baca.
Kapten Man

Apakah /bin/syncsebuah shell? jadi utilitas apa pun adalah shell?
eloone

@eloone ada dua (mungkin tiga) arti untuk "shell". Pertama, program yang dikonfigurasikan sebagai shell login di basis data kata sandi. Ini adalah arti dari kata yang dimaksud dengan frasa "shell login non-interaktif". Arti lainnya adalah "REPL yang cocok untuk pekerjaan interaktif sehari-hari pada sistem Unix". Itu interaktif. Namun, sebagian besar program yang dapat digunakan dalam konteks REPL juga mendukung penggunaan non-interaktif sebagai penerjemah untuk beberapa jenis bahasa scripting (meskipun "skrip shell" hampir secara universal berarti "skrip Bourne-family-shell").
James Youngman

2
Anda sepertinya menjawab pertanyaan yang berbeda. Anda hanya mendaftar kerang yang tersedia dan menunjukkan bahwa beberapa tidak akan pernah interaktif. Saya percaya OP menanyakan apakah shell login non-interaktif pernah ditemukan di alam liar. Jadi apakah shell yang bisa interaktif, bash misalnya, pernah meluncurkan shell login non-interaktif . Dengan kata lain, "shell login" di sini, tidak berarti "shell login default pengguna", itu berarti shell yang telah diluncurkan sebagai shell login . Lihat unix.stackexchange.com/a/46856/22222
terdon

1
Atau mungkin, mengingat bahwa poster secara eksplisit menulis bash --logindalam pertanyaan, dia bertanya secara spesifik tentang bashproses yang tidak memiliki iopsi yang ditetapkan. (Ini muncul dari perintah seperti ssh somehost < script.sh; ini akan menjadi "login, non-interaktif" shell dalam pengertian yang ditentukan dalam bagian INVOCATION dari halaman Bash.)
Curt J. Sampson
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.