SFTP SSH'ye hangi şekilde dayanmıyor?


9

OverTheWire Bandit savaş oyununu yeni bitirdim, seviye 18 .

Bu bir sürprizdi. İşte bu seviye için talimatlar.

Bir sonraki seviyenin şifresi , ev dizinindeki bir dosya benioku dosyasında saklanır . Ne yazık ki, biri SSH ile oturum açtığınızda oturumunuzu kapatmak için .bashrc dosyasını değiştirdi .

Ben kabuk kaynak atlamak için bir yol düşünüyordum .bashrc. Ancak bir çözüm bulmadan önce, sunucuyla bir SFTP bağlantısı başlatmaya başladım. Çalışmasını beklemiyordum. Ama oldu. Ve nedenini bilmek istiyorum. SFTP'nin SSH üzerinden geçtiğini düşündüm.

Açıklık için, sunucuya SSH girdiğimde, beklendiği gibi atıldım.

ssh  sftp 

1
SFTP SSH üzerinden çalışır. bash SSH üzerinden de çalışabilir. Ancak SFTP bash üzerinde çalışmaz. (burada "koşmak" gevşek kullanıyorum unutmayın)
user253751

Yanıtlar:


13

Genel olarak bash

Bash'in başlangıç ​​dosyaları ile ilgili tasarımı oldukça tuhaf. .bashrcİlişkisiz iki durumda basma yükleri :

  • Etkileşimli bir kabuk olduğunda, bir giriş kabuğu hariç (ve çağrıldığı zamanlar hariç sh). Bu yüzden .bash_profiletipik olarak yüklenir.bashrc .
  • Bash olduğunda değil interaktif ne de bir giriş kabuğu ne de olarak çağrılan shile yürütülecek bir komut verilmiş ancak -cve SHLVLayarlanmazsa veya daha az veya 1'e eşit olduğu ve aşağıdakilerden biri doğrudur:

    • Standart giriş bir soketse. Pratikte, bu çoğunlukla bash tarafından çağrıldığında rshd, yani koşarken olur rsh remotehost.example.com somecommand.
    • Derleme zamanında etkinleştirilirse (Debian ve türevleri gibi bazı dağıtımlarda olduğu gibi), ortam değişkenlerinden biri SSH_CLIENTveya SSH2_CLIENTtanımlanmışsa. Pratikte bu, bash tarafından çağrılır sshd, yani ssh remotehost.example.com somecommand.
      Bash'ın nasıl derlendiğini bilmiyorsanız, ikili seçeneğin dizeyi içerip içermediğini kontrol ederek bu seçeneğin ayarlanıp ayarlanmadığını öğrenebilirsiniz SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

Genel olarak SSH hakkında

SSH protokolü üzerinden bir komut yürüttüğünüzde, komut tel üzerinden bir dize olarak iletilir. Dize uzak kabuk tarafından yürütülür. Çalıştırdığınızda ssh example.com somecommand, uzak kullanıcının oturum açma kabuğu /bin/bashSSH sunucusu çalışır /bin/bash -c somecommand. Giriş kabuğunu atlamanın bir yolu yoktur. Bu, kısıtlı oturum açma kabuklarına izin verir, örneğin, genel komut yürütmesine değil , yalnızca dosya kopyalamaya izin verir .

Bir istisna vardır: SSH protokolü, istemcinin belirli bir alt sistem istemesine izin verir. İstemci sftpalt sistemi talep ederse, varsayılan olarak OpenSSH sunucusu /usr/lib/openssh/sftp-serverkullanıcının oturum açma kabuğu aracılığıyla programı çağırır (konum değişebilir). Ancak, hat üzerinden dahili bir SFTP sunucusu çalıştıracak şekilde de yapılandırılabilir

Subsystem sftp internal-sftp

içinde sshd_configdosyaya. Dahili SFTP sunucusu için ve yalnızca bu durumda, kullanıcının oturum açma kabuğu atlanır.

Bu meydan okuma için

OverTheWire Haydut 18 durumunda .bashrc,

…
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
…
echo 'Byebye !'
exit 0

Böylece bash'ın interaktif olmamasına neden olan bir şey yaparak bu seviyeyi çözebilirsiniz.

Keşfettiğiniz gibi, SFTP çalışır.
Ama ssh bandit18@bandit.labs.overthewire.org cat readmeaynı zamanda işe yarar.
Olduğu gibi echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
Ve interaktif bir giriş sırasında Ctrl + C tuşlarına doğru zamanda basmak da işe yarayacaktır: bash'ı kesecekti, bu yüzden .bashrctamamen yürütülmeyecekti. Bash'ın başlatılması makroskopik zaman alır, bu nedenle bu güvenilir bir şekilde çalışmazken, pratikte yapılabilir.


2
Ben SFTP çalışır bash sanmıyorum hiç değil, sadece sigara etkileşimli.
user253751

@immibis Bu konuda doğru olduğuna inanıyorum. Ben bir uygulama ile "gerçek" kabuk yerine giriş kabuğu olarak yapılandırılmış bir kullanıcı hesabında dosya alışverişi için SFTP kullandım.
kasperd

@immibis SFTP bash çalıştırmaz. Ancak SFTP sunucusu dahili değilse, sshdkullanıcının çalıştığı oturum açma kabuğunu çalıştırır sftp-server. Bu nedenle, giriş kabuğu dizeyi /usr/lib/openssh/sftp-server“komutu çalıştır” olarak yorumlamazsa, /usr/lib/openssh/sftp-serverSFTP'yi kullanamazsınız.
Gilles 'SO- kötü olmayı bırak

5

.bashrcEğer bir kabuk başlattığınızda sadece yürütülür.

SSH sunucusu Subsystem internal-sftp, sunucu sshd_configdosyasındaki komutu sağlayarak SFTP protokolü için bir kabuk başlatmayacak şekilde yapılandırılabilir .

Konjektif: OverTheWire Bandit savaş oyununun bir ayarlama yerine aslında bu şekilde yapılandırılması muhtemeldir, .bashrcçünkü aksi takdirde aynı kısıtlama sunucu komutunu sshda engelleyecektir sftp.


2
SFTP'yi Running yapar bir kabuk başlatın. SSH arka plan programı , kullanıcının giriş kabuğunun /path/to/shell -c /path/to/sftp-serverolduğu yerde çalışır /path/to/shell. Kullanıcının oturum açma kabuğu bash ise, bash'ın .bashrcnasıl derlendiğine bağlı olarak yürütülebilir. Her zaman bash tarafından yürütüldüğünde yürütülür rshd(evet, etkileşimli olmayan bir kabuk için bile, bash başlatma gariptir) ve bir derleme zamanı seçeneği bunu genişletir sshd.
Gilles 'SO- kötü olmayı bırak'

Gittim ve kontrol ettim. İyi tahmin, ama aslında o kadar ince değil. exitİçinde .bashrcbash etkileşimli ise sadece yürütülür.
Gilles 'SO- kötü olmayı bırak

@Gilles ile Subsystem sftp internal-sftpve echo No.; exit 1benim sunucuya erişimim .bashrcyok sshama sftphala çalışıyor. (Ve elbette .bashrc. İzinlerine rağmen üzerine yazmak veya kaldırmak olasıdır .) sshBağlantı girişimi etkileşimli olsun veya olmasın başarısız olur. Öte yandan, varsa Subsystem sftp /usr/lib/openssh/sftp-servero zaman SFTP hizmeti de .bashrckarıştırıldığında başarısız olur .
roaima

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.