GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Bash Tahu Bagaimana Itu Dipanggil?

Saya telah menginstal jailkit di Ubuntu 12.04 dan saya telah menyiapkan shell pengguna ke /bin/bash – tetapi ketika dipanggil menjalankan /etc/bash.bashrc bukannya /etc/profile

Jika Anda belum pernah menggunakan jailkit sebelum ini intinya:

  1. Versi root sistem yang "dipenjara" dibuat di suatu tempat, seperti /home/jail
  2. Direktori beranda pengguna yang dipenjara dipindahkan ke dalam folder itu seperti /home/jail/home/testuser
  3. File konfigurasi yang relevan disalin ke /home/jail/etc/ – termasuk /etc/passwd terbatas
  4. Program yang ingin Anda izinkan aksesnya disalin ke direktori yang sesuai, seperti
    /bin/bash
  5. Saat pengguna yang dipenjara masuk, mereka di-chroot ke /etc/jail/ dan tidak dapat melihat file apa pun di atas itu

Jadi saya punya testuser yang memiliki entri di /etc/passwd seperti ini:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

Dalam file /home/jail/etc/passwd ada entri seperti:

testuser:1001:1003::/home/testuser:/bin/bash

Saya telah membaca bash(1) jadi saya pikir masalahnya adalah bash mengira itu tidak dipanggil sebagai shell login:

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi –login, bash pertama-tama membaca dan mengeksekusi perintah dari file
/etc/profile, jika file itu ada.

Saya mendapatkan bash sebenarnya sedang dipanggil oleh /usr/sbin/jk_chrootsh tapi saya tidak mengerti bagaimana bash menentukan jenis shell itu, dan kumpulan file startup apa yang harus dijalankan.

Saya ingin melihat apakah saya dapat memecahkan masalah ini – tetapi saya tidak mengerti:

Bagaimana bash tahu bagaimana itu dipanggil?

ps:Saya juga melihat ke login(1) tanpa banyak keberuntungan.

Jawaban yang Diterima:

Biasanya bash tahu bahwa itu adalah shell login karena ketika program login memanggilnya, ia memberi tahu bash bahwa namanya adalah -bash . Nama itu ada di argv[0] , argumen baris perintah ke-nol, yang secara konvensional merupakan cara pengguna menjalankan program. Tanda hubung awal adalah konvensi untuk memberi tahu shell bahwa itu adalah shell login. Bash juga berfungsi sebagai shell login jika Anda memberikan opsi --login atau -l . Lihat Perbedaan antara Shell Login dan Shell Non-Login? untuk lebih jelasnya.

Pada Jailkit 2.16, jk_chrootsh membaca jalur absolut ke shell untuk dipanggil dari berbagai sumber, dan meneruskan jalur ini sebagai argv[0] , dan meneruskan argumen baris perintahnya sendiri ke shell itu. Dalam kasus penggunaan normal di mana jk_chrootsh itu sendiri digunakan dalam /etc/passwd , tidak ada cara untuk melewatkan argumen seperti -l . Karena jalur absolut tidak dimulai dengan - , tidak ada cara untuk membuat jk_chrootsh aktifkan shell login, tanpa menggunakan program perantara kecil.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Saya mengharapkan jk_chrootsh untuk memiliki cara mudah menjalankan shell login. Saya sarankan membuat permintaan fitur.

Terkait:Apa yang dilakukan 'exec {fd}/watchdog' di Bash?
Linux
  1. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  2. Bagaimana Gcc Mengetahui Dimana Boost Dipasang?

  3. Bagaimana Cara Mengubah Cron Shell (sh ke Bash)?

  1. Bagaimana cara kerja cat << EOF di bash?

  2. Bagaimana saya tahu jika saya menjalankan shell bersarang?

  3. Cara memasukkan file dalam skrip bash shell

  1. Cara memprogram dengan Bash:Sintaks dan alat

  2. Bagaimana caranya:Riwayat Bash/Shell yang tidak terbatas?

  3. Bagaimana bash menguji 'false'?