Ogólnie o bashu
Projekt Bash w odniesieniu do plików startowych jest dość osobliwy. Obciążenia bash .bashrcw 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_profilezwykle ładuje.bashrc .
Gdy bash nie jest interaktywny ani nie jest powłoką logowania ani nie jest wywoływany, ponieważ shotrzymał polecenie wykonania z -ci SHLVLjest 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_CLIENTlub SSH2_CLIENTjest 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 sftppodsystemu, 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_configpliku. 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 .bashrczawiera
…
# 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 readmeteż 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 .bashrcnie zostałoby całkowicie wykonane. Uruchomienie Bash zajmuje czas makroskopowy, więc chociaż nie działa to niezawodnie, można to zrobić w praktyce.