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?

Cyker
sumber
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.

Jakuje
sumber
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