Di pesta secara umum
Desain Bash sehubungan dengan file startup agak aneh. Bash memuat .bashrc
dalam dua keadaan yang tidak terkait:
Pada SSH secara umum
Ketika Anda menjalankan perintah melalui protokol SSH, perintah tersebut dilewatkan melalui kawat sebagai string. String dijalankan oleh shell jarak jauh. Ketika Anda menjalankan ssh example.com somecommand
, jika shell login pengguna jarak jauh adalah /bin/bash
, server SSH berjalan /bin/bash -c somecommand
. Tidak ada cara untuk memotong shell login. Ini memungkinkan shell login terbatas, misalnya hanya memperbolehkan penyalinan file dan bukan eksekusi perintah umum.
Ada satu pengecualian: protokol SSH memungkinkan klien untuk meminta subsistem tertentu. Jika klien meminta sftp
subsistem, maka secara default server OpenSSH memanggil program /usr/lib/openssh/sftp-server
(lokasi mungkin bervariasi) melalui shell login pengguna. Tetapi juga dapat dikonfigurasi untuk menjalankan server SFTP internal melalui saluran
Subsystem sftp internal-sftp
dalam sshd_config
file. Dalam kasus server SFTP internal, dan hanya dalam kasus ini, shell login pengguna dilewati.
Untuk tantangan ini
Dalam kasus OverTheWire Bandit 18, .bashrc
berisi
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Jadi, Anda dapat menyelesaikan level ini dengan melakukan apa pun yang menyebabkan bash tidak bersifat interaktif.
Ketika Anda menemukan, SFTP berfungsi.
Tetapi ssh bandit18@bandit.labs.overthewire.org cat readme
juga akan berhasil.
Seperti yang akan echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
Dan menekan Ctrl + C pada waktu yang tepat selama login interaktif juga akan berfungsi: itu akan mengganggu bash, jadi .bashrc
itu tidak akan sepenuhnya dieksekusi. Bash membutuhkan waktu makroskopis untuk memulai, jadi sementara ini tidak bekerja dengan andal, itu bisa dilakukan dalam praktek.