Neden ssh kabuğundaki bir değişkeni dışa aktarma, dışa aktarılan değişkenlerin listesini yazdırır?


17

Bunu düşün:

$ ssh localhost bash -c 'export foo=bar'
terdon@localhost's password: 
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x HOME="/home/terdon"
declare -x LOGNAME="terdon"
declare -x MAIL="/var/spool/mail/terdon"
declare -x OLDPWD
declare -x PATH="/usr/bin:/bin:/usr/sbin:/sbin"
declare -x PWD="/home/terdon"
declare -x SHELL="/bin/bash"
declare -x SHLVL="2"
declare -x SSH_CLIENT="::1 55858 22"
declare -x SSH_CONNECTION="::1 55858 ::1 22"
declare -x USER="terdon"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="c5"
declare -x _="/usr/bin/bash"

Neden bir bash -coturum içindeki bir değişkeni dışa aktarma ssh aracılığıyla çalıştırılırsa, bu declare -xkomutlar listesine (şu anda açıklayabildiğim kadarıyla dışa aktarılan değişkenlerin listesi) neden olur?

Aynı şeyi yapmadan çalıştırmak bash -cbunu yapmaz:

$ ssh localhost  'export foo=bar'
terdon@localhost's password: 
$

Biz yapmazsak da olmaz export:

$ ssh localhost bash -c 'foo=bar'
terdon@localhost's password: 
$ 

Bunu bir Ubuntu makinesinden diğerine (her ikisi de bash 4.3.11 çalıştıran) ve bir Arch makinesinde sshing yaparak yukarıda gösterildiği gibi kendisine sshing yaparak test ettim (bash sürüm 4.4.5).

Burada neler oluyor? Bir bash -cçağrının içindeki bir değişkeni dışa aktarma neden bu çıktıyı üretir?


Bu soruya cevap vermez, ama sonuç koşmanın sonucudur export. Zsh da aynı şeyi yapar.
Stephen Kitt

@StephenKitt evet, biliyorum export, ne olduğunu anlamaya çalışıyorum; Bunun yalnızca dışa aktarma sırasında olduğunu açıklığa kavuşturacağım.
terdon

Ah Tamam, "şu anda dışa aktarılan değişkenlerin listesini, anlayabildiğim kadarıyla" okudum, bu da çıktının nereden geldiğini bilmediğiniz anlamına geliyordu.
Stephen Kitt

@StephenKitt Yani her dışa aktarılan değişken ya da belirli bir alt küme ya da ne olduğundan emin değilim . Ah! Yani exporttek başına koşmanın çıktısı mı? Anlamadığım için.
terdon

foo=barListede görünmediğini unutmayın .
deltab

Yanıtlar:


31

Aracılığıyla bir komut sshçalıştırdığınızda $SHELL, -cbayrak ile aranarak çalıştırılır :

-c    If the -c option is present, then commands are read from 
      the first non-option argument command_string.  If there  are
      arguments  after the command_string, the first argument is 
      assigned to $0 and any remaining arguments are assigned to
      the positional parameters.  

Yani, ssh remote_host "bash -c foo"aslında çalışacak:

/bin/your_shell -c 'bash -c foo'

Şimdi, çalıştırdığınız komut ( export foo=bar) boşluk içerdiğinden ve bir bütün oluşturmak için düzgün bir şekilde alıntılanmadığından, exportçalıştırılacak komut olarak alınır ve geri kalanı konum parametreleri dizisine kaydedilir. Bu export, çalıştırıldığı ve foo=barona aktarıldığı anlamına gelir $0. Nihai sonuç koşu ile aynıdır

/bin/your_shell -c 'bash -c export'

Doğru komut:

ssh remote_host "bash -c 'export foo=bar'"

9

ssh bağımsız değişkenleri boşluklarla birleştirir ve uzak kullanıcının oturum açma kabuğunun yorumlamasını sağlar, böylece:

ssh localhost bash -c 'export foo=bar'

ssh uzak kabuktan

bash -c export foo=bar

Komut (aslında, uzak ana ise Unix benzeri, bu uzaktan kabuk çalışır the-shell, -cve bash -c export foo=barargümanlar gibi).

Çoğu kabuklar çalıştıran olarak bu komut satırını yorumlayacaktır bashile komutu bash, -c, exportve foo=barbağımsız değişkenleri olarak (böylece çalıştırmak exportiken $0içeren foo=barbunu birlikte çalıştırmak isterdim iken) bash, -cve export foo=barbağımsız değişkenleri olarak.

Bunun için aşağıdaki gibi bir komut satırı kullanmanız gerekir:

ssh localhost "bash -c 'export foo=bar'"

(veya:

ssh localhost bash -c \'export foo=bar\'

bu nedenle):

bash -c 'export foo=bar'

komut satırı uzak kabuğa iletilir. Bu komut satırı çalışan gibi en kabukları tarafından yorumlanır bashile komutu bash, -cve export foo=barbağımsız değişkenleri olarak. Kullanarak

ssh localhost 'bash -c "export foo=bar"'

uzak kullanıcının oturum açma kabuğu rcveya esörneğin "özel bir tırnak işleci olmadığı durumlarda çalışmaz. Tek tırnak (onlar kabukları arasına nasıl yorumlandığı üzerinde bazı değişiklikler olsa, bkz çoğu taşınabilir alıntı operatörleri ? Uzaktan kullanıcının oturum açma kabuğu bilmeden ssh üzerinden keyfi bir basit komut çalıştırmak için nasıl daha bu konuda için).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.