Bash nói chung
Thiết kế của Bash đối với các tệp khởi động khá đặc biệt. Bash tải .bashrc
trong hai trường hợp không liên quan:
Trên SSH nói chung
Khi bạn thực thi một lệnh thông qua giao thức SSH, lệnh được truyền qua dây dưới dạng một chuỗi. Chuỗi được thực hiện bởi shell từ xa. Khi bạn chạy ssh example.com somecommand
, nếu vỏ đăng nhập của người dùng từ xa là /bin/bash
, máy chủ SSH sẽ chạy /bin/bash -c somecommand
. Không có cách nào để bỏ qua vỏ đăng nhập. Điều này cho phép các shell đăng nhập bị hạn chế, ví dụ chỉ cho phép sao chép tệp và không thực thi lệnh chung.
Có một ngoại lệ: giao thức SSH cho phép khách hàng yêu cầu một hệ thống con cụ thể. Nếu máy khách yêu cầu sftp
hệ thống con, thì theo mặc định, máy chủ OpenSSH gọi chương trình /usr/lib/openssh/sftp-server
(vị trí có thể thay đổi) thông qua vỏ đăng nhập của người dùng. Nhưng nó cũng có thể được cấu hình để chạy một máy chủ SFTP nội bộ thông qua dòng
Subsystem sftp internal-sftp
trong sshd_config
tập tin Trong trường hợp máy chủ SFTP nội bộ và chỉ trong trường hợp này, vỏ đăng nhập của người dùng bị bỏ qua.
Đối với thử thách này
Trong trường hợp của OverTheWire Bandit 18, .bashrc
có chứa
…
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
…
echo 'Byebye !'
exit 0
Vì vậy, bạn có thể giải quyết cấp độ này bằng cách làm bất cứ điều gì khiến bash không tương tác.
Như bạn đã khám phá, SFTP hoạt động.
Nhưng ssh bandit18@bandit.labs.overthewire.org cat readme
cũng sẽ làm việc.
Như sẽ echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.
Và nhấn Ctrl + C vào đúng thời điểm trong quá trình đăng nhập tương tác cũng sẽ hoạt động: nó sẽ làm gián đoạn bash, do đó .bashrc
sẽ không được thực thi hoàn toàn. Bash mất thời gian vĩ mô để khởi động, vì vậy trong khi điều này không hoạt động đáng tin cậy, nó có thể được thực hiện trong thực tế.