GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Argumen Baris Perintah Jarak Jauh Ssh Diurai?

Saya telah melihat pertanyaan dan jawaban tentang perlunya menggandakan argumen ke perintah ssh jarak jauh. Pertanyaan saya adalah:Tepatnya di mana dan kapan parsing kedua dilakukan?

Jika saya menjalankan yang berikut:

$ ssh otherhost pstree -a -p

Saya melihat yang berikut di output:

  |-sshd,3736
  |   `-sshd,1102
  |       `-sshd,1109
  |           `-pstree,1112 -a -p

Proses induk untuk perintah jarak jauh (pstree ) adalah sshd , tampaknya tidak ada shell di sana yang akan menguraikan argumen baris perintah ke perintah jarak jauh, jadi sepertinya tidak perlu mengutip dua kali atau melarikan diri (tapi memang demikian). Jika sebaliknya saya ssh di sana terlebih dahulu dan mendapatkan shell login, lalu jalankan pstree -a -p Saya melihat yang berikut di output:

  ├─sshd,3736
  │   └─sshd,3733
  │       └─sshd,3735
  │           └─bash,3737
  │               └─pstree,4130 -a -p

Jadi jelas ada bash Shell di sana yang akan melakukan penguraian baris perintah dalam kasus itu. Tetapi kasus di mana saya menggunakan perintah jarak jauh secara langsung, sepertinya tidak ada shell, jadi mengapa kutipan ganda diperlukan?

Jawaban yang Diterima:

Selalu ada cangkang jarak jauh. Dalam protokol SSH, klien mengirimkan string ke server untuk dieksekusi. Klien baris perintah SSH mengambil argumen baris perintahnya dan menggabungkannya dengan spasi di antara argumen. Server mengambil string itu, menjalankan shell login pengguna dan meneruskan string itu. (Lebih tepatnya:server menjalankan program yang terdaftar sebagai shell pengguna di database pengguna, meneruskannya dua argumen baris perintah:-c dan string yang dikirim oleh klien. Shell tidak dipanggil sebagai shell login:server tidak menyetel argumen ke nol ke string yang dimulai dengan - .)

Tidak mungkin untuk melewati shell jarak jauh. Protokol tidak memiliki sesuatu seperti mengirim larik string yang dapat diuraikan sebagai larik argv di server. Dan server SSH tidak akan melewati shell jarak jauh karena itu bisa menjadi batasan keamanan:menggunakan program terbatas sebagai shell pengguna adalah cara untuk menyediakan akun terbatas yang hanya diizinkan untuk menjalankan perintah tertentu (mis. akun khusus git).

Anda mungkin tidak melihat shell di pstree karena mungkin sudah pergi. Banyak shell memiliki optimasi di mana jika mereka mendeteksi bahwa mereka akan melakukan "jalankan perintah eksternal ini, tunggu sampai selesai, dan keluar dengan status perintah", maka shell menjalankan "execve perintah eksternal ini” sebagai gantinya. Inilah yang terjadi dalam contoh pertama Anda. Bandingkan tiga perintah berikut:

ssh otherhost pstree -a -p
ssh otherhost 'pstree -a -p'
ssh otherhost 'pstree -a -p; true'

Dua yang pertama identik:klien mengirimkan data yang sama persis ke server. Yang ketiga mengirimkan perintah shell yang mengalahkan optimasi exec shell.

Terkait:Apa perbedaan antara kunci putar dan semafor?
Linux
  1. Bagaimana perubahan ukuran terminal dikirim ke aplikasi baris perintah melalui ssh atau telnet?

  2. Dapatkan baris pertama dari keluaran perintah shell

  3. Bagaimana cara mendapatkan alamat IP saya dari baris perintah?

  1. Bagaimana Cara Mendapatkan Hitungan File Dalam Direktori Menggunakan Baris Perintah?

  2. Bagaimana Cara Melewati Argumen Baris Perintah Menjadi Skrip Shell?

  3. Bagaimana Cara Membunuh Baris Perintah Chromium Melalui Ssh?

  1. Nagios:Cara Mengaktifkan Argumen Baris Perintah check_nrpe

  2. Cara Menghubungkan Host Jarak Jauh Menggunakan Perintah ssh

  3. Cara menggunakan fungsi shell baris perintah di Linux