Di pesta secara umum
Desain Bash sehubungan dengan file startup agak aneh. Bash memuat .bashrcdalam 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 sftpsubsistem, 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_configfile. Dalam kasus server SFTP internal, dan hanya dalam kasus ini, shell login pengguna dilewati.
Untuk tantangan ini
Dalam kasus OverTheWire Bandit 18, .bashrcberisi
…
# 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 readmejuga 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 .bashrcitu tidak akan sepenuhnya dieksekusi. Bash membutuhkan waktu makroskopis untuk memulai, jadi sementara ini tidak bekerja dengan andal, itu bisa dilakukan dalam praktek.