Когда удаленный ssh-клиент запрашивает выполнение команды на сервере, сервер OpenSSH запускает оболочку локального пользователя с опцией -c для запуска команды. Это запускает эквивалент этого:
$SHELL -c 'the requested command'
Например, если удаленный пользователь запустил:
ssh user@somehost 'rm -rf /'
и "user @ somehost" имеет /bin/bash
качестве оболочки, тогда сервер будет запускать эквивалент:
/bin/bash -c 'rm -rf /'
SFTP немного сложнее, но вы в конечном итоге на том же месте. Удаленный клиент запрашивает у сервера запуск подсистемы "sftp". В файле sshd_config
сервера у вас, вероятно, есть такая строка:
Subsystem sftp /path/to/sftp-server
Эта строка гласит:«Когда клиент запрашивает подсистему 'sftp', запустите /path /to /sftp-server" sftp-server
- это программа, включенная в OpenSSH, которая реализует серверную часть протокола SFTP. Поэтому, когда ssh-клиент подключается и запрашивает подсистему sftp, сервер в конечном итоге работает:
$SHELL -c /path/to/sftp-server
(Существует особый случай, называемый «internal-sftp», в который я не буду вдаваться.)
Теперь вы написали скрипт с именем /usr/bin/redtest
и установили его в качестве оболочки пользователя. Поэтому, когда удаленный пользователь пытается запустить sftp, сервер в конечном итоге запустится:
/usr/bin/redtest -c /path/to/sftp-server
Ваш redtest
скрипт игнорирует командную строку и просто запускает простой ssh-сеанс с целевым сервером. Он никогда не запускает программу sftp-server на целевом сервере.
Чтобы это работало, вам нужно сделать самый быстрый запуск sftp sftp-server
на целевом хосте, когда redtest запускается таким образом. Если вы не слишком требовательны к тому, что пользователь запускает на целевом хосте, то что-то вроде этого должно работать:
#!/bin/bash
if [ "$1" = "-c" ]
then
/usr/bin/ssh redtest -F ~/.ssh/config "$2"
else
/usr/bin/ssh redtest -t -F ~/.ssh/config
fi
Это будет проходить через любую команду, запрошенную клиентом, а не только через sftp. Это не должно быть проблемой, так как пользователи, по-видимому, в любом случае имеют корневой доступ к целевым серверам из командной строки.
Здесь вы можете столкнуться с проблемой, если на хосте перехода и на хосте назначения нет программы sftp-server
в одном месте. Сервер ssh на хосте перехода будет пытаться запустить sftp-сервер, используя путь из конфигурации хоста перехода, который может быть неправильным для целевого хоста. Вы должны убедиться, что sftp-server
может быть запущен на целевом хосте, используя путь в sshd_config хоста перехода.
Если вы хотите сделать самый redtest
скрипт более изощренным, вы можете организовать, чтобы он выполнял что-то вроде этого, когда удаленный пользователь пытается запустить sftp:
/usr/bin/ssh redtest -F ~/.ssh/config -s sftp
Аргументы -s
и sftp
специально запрашивают запуск подсистемы sftp на целевом хосте.