Ogólnie o bashu
Projekt Bash w odniesieniu do plików startowych jest dość osobliwy. Obciążenia bash .bashrc
w dwóch niepowiązanych okolicznościach:
- Gdy jest to powłoka interaktywna, z wyjątkiem sytuacji, gdy jest to powłoka logowania (i z wyjątkiem sytuacji, gdy jest wywoływana jako
sh
). Dlatego .bash_profile
zwykle ładuje.bashrc
.
Gdy bash nie jest interaktywny ani nie jest powłoką logowania ani nie jest wywoływany, ponieważ sh
otrzymał polecenie wykonania z -c
i SHLVL
jest nieustawiony lub mniejszy lub równy 1, i spełniony jest jeden z poniższych warunków:
- Jeśli standardowe wejście jest gniazdem. W praktyce dzieje się tak głównie wtedy, gdy wywoływany jest bash
rshd
, tj. Podczas działania rsh remotehost.example.com somecommand
.
Jeśli aktywowany w czasie kompilacji (co ma miejsce w niektórych dystrybucjach, takich jak Debian i pochodne), jeśli jedna ze zmiennych środowiskowych SSH_CLIENT
lub SSH2_CLIENT
jest zdefiniowana. W praktyce oznacza to, że bash jest wywoływany przez sshd
, tj ssh remotehost.example.com somecommand
.
Jeśli nie wiesz, jak skompilowano bash, możesz dowiedzieć się, czy ta opcja została ustawiona, sprawdzając, czy plik binarny zawiera ciąg SSH_CLIENT
:
strings /bin/bash | grep SSH_CLIENT
Ogólnie o SSH
Gdy wykonujesz polecenie za pomocą protokołu SSH, polecenie jest przekazywane przez przewód jako ciąg znaków. Ciąg jest wykonywany przez zdalną powłokę. Po uruchomieniu ssh example.com somecommand
, jeśli jest to powłoka logowania użytkownika zdalnego /bin/bash
, działa serwer SSH /bin/bash -c somecommand
. Nie ma możliwości ominięcia powłoki logowania. Pozwala to na ograniczone powłoki logowania, na przykład, aby umożliwić tylko kopiowanie plików, a nie ogólne wykonywanie poleceń.
Jest jeden wyjątek: protokół SSH pozwala klientowi zażądać określonego podsystemu. Jeśli klient zażąda sftp
podsystemu, wówczas serwer OpenSSH domyślnie wywołuje program /usr/lib/openssh/sftp-server
(lokalizacja może się różnić) za pośrednictwem powłoki logowania użytkownika. Ale można go również skonfigurować do uruchamiania wewnętrznego serwera SFTP przez linię
Subsystem sftp internal-sftp
w sshd_config
pliku. W przypadku wewnętrznego serwera SFTP i tylko w tym przypadku powłoka logowania użytkownika jest pomijana.
Do tego wyzwania
W przypadku OverTheWire Bandit 18 .bashrc
zawiera
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Możesz więc rozwiązać ten poziom, robiąc wszystko, co powoduje, że bash nie jest interaktywny.
Jak odkryłeś, SFTP działa.
Ale ssh bandit18@bandit.labs.overthewire.org cat readme
też by działało.
Jak można echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
I naciśnięcie Ctrl + C w odpowiednim czasie podczas interaktywnego logowania również działałoby: przerwałoby bash, więc .bashrc
nie zostałoby całkowicie wykonane. Uruchomienie Bash zajmuje czas makroskopowy, więc chociaż nie działa to niezawodnie, można to zrobić w praktyce.