Bagaimana ssh menjalankan perintah?


15

Saya menggunakan Bash pada klien dan server. Saat menjalankan perintah melalui SSH:

  • ssh <host> 'declare' memberikan daftar variabel shell.

  • ssh <host> 'mount' memberikan daftar mountpoints.

Namun, declareadalah Bash builtin, sedangkan mountperintah eksternal. Bagaimana SSH tahu mana yang harus dijalankan jika ada builtin shell dan perintah eksternal dengan nama yang sama di server?


2
ssh selalu jalankan shell Anda, yang disimpan di /etc/passwd. Jika /usr/sbin/nologinAnda tidak dapat login.
Ipor Sircer

Jawaban:


21

The sshmenjalankan perintah yang Anda berikan dalam shell pengguna remote (yang diperoleh dari /etc/passwd), sebagai terlihat dari kode sumber :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

Oleh karena itu perintah masing-masing yang dijalankan untuk contoh Anda pada server jarak jauh adalah:

  • bash -c declare
  • bash -c mount

Keduanya diteruskan ke bashdan dievaluasi. Built-in dievaluasi di dalam, dan perintah eksternal dipanggil seolah-olah Anda akan melakukannya dari prompt baris perintah lokal Anda.


Jika sebuah shell selalu dimulai dengan ssh daemon, maka hal yang menarik adalah, ketika pengguna memanggil ssh dengan sebuah perintah, maka shell tersebut bukanlah shell login, bahkan jika pengguna melakukan semacam login. Ada ide?
Cyker

Iya. Shell yang menjalankan perintah adalah 1) Tidak ada shell login 2) Tidak yang interaktif. Anda dapat memaksa interaktivitas dengan -tberalih, tetapi masih tidak memuat file rc.
Jakuje

1
Perhatikan bahwa sshd(server) melakukan ini, bukan ssh(klien).
ysdx

@ysdx Mereka bekerja bersama. Klien memberi tahu server untuk mengeksekusi perintah melalui shell, dan server melakukannya.
Barmar
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.