LINUX.ORG.RU

bash script вместо shell для пользователя

 


0

2

Здравствуйте, коллеги! Разумеется, подсунуть пользователю скрипт, который будет его «шелом» - ни каких проблем:

cat /etc/passwd/grep testuser
testuser:x:502:502::/home/testuser:/usr/bin/testshell.sh

cat /usr/bin/testshell.sh
#!/bin/bash
echo "Hello testuser!"
read

Пользователь заходит под учетной записью testuser и получает трогательное приветствие и закрывает сессию после нажатия любой клавиши. Здорово!

Разумеется, можно насытить это testshell.sh разной информацией, но нужно чуть другое.

Нужно что бы скрипт собрал кучку разных файлов, сложил в определенную папку, например /tmp/test, «заTARил» и… Каким-то образом отдал юзверю.

Собрать, заархивировать - ерунда.

Сложности с отдачей файла.

На сервере нет и не должно быть ни чего лишнего. Т.е. всяких http, ftp, smb и прочих. Только ssh!

У пользователя testuser не должно быть возможности выйти в любой shell и, вообще, делать что либо, не предусмотренное скриптом testshell.sh. Но ему нужно как-то отдать подготовленный архив.

Дополнительная сложность в том, что не известно с какой ОС будет входить testuser. Может быть винда. Даже Windows 7. И пользователю доставлять дополнительное ПО нельзя.

Следовательно: с сервера кинуть по scp не выйдет. У юзверя, попросту, нет ssh сервера.

Расшара пользовательской папки так же не вариант. Нужно всю эту хрень реализовать внутри ssh и под конкретной учетной записью: testuser.

Я чуток поковырял и узнал, что testshell.sh может получить параметры запуска:

ssh testuser@myserver.com bla-bla-bla bla

Скрипт получает bla-bla-bla и даже bla.

Можно как-то подменить им шел для scp?

Что бы юзверь обратился например:

scp testuser@myserver.com:/etc/shadow .

И мой скрипт, как-то позволил ему скачать ему строго пределенный файл?

Ведь, мой скрипт может наплевать на весь путь, указанный в scp и начать отдавать ему лишь то, что подготовлено для testuser



Последнее исправление: HighMan (всего исправлений: 2)

Кое что стало понятно! Во первых:

ssh testuser@myserver.com bla-bla-bla bla

Скрипт получает аргументы: -с, bla-bla-bla и bla

При получении определенного аргумента

if [ $# -eq 2 ]; then
# считаем что argv[1] имя файла в директории /tmp
   if [ -f /tmp/${1} ]; then # если есть, то
      cat /tmp/${1}
      rm -fr /tmp/${1}
      exit 0
   fi
fi

Юзверю достаточно ввести команду:

ssh testuser@myserver.com bla-bla-bla > bla-bla-bla

И он получил нужный файл

Во вторых:

Если юзверь лезет scp, то… Простите, но для понятности я решил воспользоваться сишным синтаксисом int main(int argc, char ** argv), что бы было понятнее

argc = 2
argv[0] = "-c"
argv[1] = "/usr/lib/openssh/sftp-server"

О чем это говорит? Судя по всему, достаточно запустить sftp-server без параметров и он сам договорится с scp юзверя, что ему там передавать.

Но! Поскольку мне не годится что бы юзверь сам мог задавать какой файл скачивать, то такой способ не подходит. В противном случае юзверь сможет скачать все, до чего хватит прав аккаунта, да и, по идее, может закинуть что хочет, опять же, в зависимости от прав.

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 4)

Мужик это совсем эзотерика. Эзотерика в том, что у тебя клиенты разные. Просто через ssh клиент такое не сделать. Надо городить дичь на клиенте. Тут напрашивается sftp chroot. Загугли эти два слова вместе.

Запускать скрипт по факту входа.

comma
()
Ответ на: комментарий от apt_install_lrzsz

Пускай скрипт сконвертит архив в base64 и вывалит результат прямо в терминал

Лучше уж в бинарном виде, будет юзабельно, если перенаправить вывод ssh в файл

annulen ★★★★★
()
Ответ на: комментарий от comma

Тут напрашивается sftp chroot. Загугли эти два слова вместе.

Напрашивается. Да. Специфика задачи не позволяет.

Через ssh клиента все можно сделать, через перенаправление вывода.

Просто сначала нужно собрать архив, получить имя файла и передать его в следующей сессии, перенаправив вывод в файл.

Главное, что скрипт прекрасно получает аргументы командной строки, которые передаются ssh клиентом на сервер как… Как команда на выполнение.

После генерации архива нужно закрыть текущую сессию или создать новую, передав нужные параметры:

ssh testuser@myserver.com filename.tar.gz > filename.tar.gz

Строка выгрузки генерируется скриптом и передается юзверю. Тому достаточно его скопипастить в новую сессию.

Скрипт (shell) получает 2 аргумента:

$0 # "-c"
$1 # "filename.tar.gz"

Дальше, согласно моей задумке, скрипт-shell проверяет аргуметны и если filename.tar.gz лежит в директории генерации, например /tmp/filename.tar.gz, то просто catит его в stdout. Со стороны юзверя идет перенаправление в файл.

Разумеется, можно дополнительно нагородить с провркой аргументов и попробовать защитится от нежелательного слива, сделав например arhive=filename.tar.gz и дальше разбивать эту строку на ключ и значение, но это, в любом случае, лишь макияж.

Сложность возникает с виндузверями, которые используют PuTTY или еще какой «продвинутый» клиент, но это уже не моя головная боль.

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 1)
Ответ на: комментарий от skyman

Так пусть твой скрипт собирает файлы и кладёт в корень веб сервера, и в ответ юзеру пишет ссылку на это. А кроном чистится все что старее месяца.

Это порождение дополнительных сучностей, которое в данном случае недопустимо.

Весь этот огород будет крутится на оборудовании, выполняющем строго конкретные функции и среди них нет web сервера. Попросту запрещено.

Так же нет ftp, smb, nfs и прочего.

Спасибо что хоть ssh оставили)

Вот и приходится изголяться и допфункционал запихивать в ssh.

Кроме того, как я писал выше: script-shell получает довольно незамысловатые аргументы, если юзверь пытается что-то качнуть через scp или его аналог.

script-shell получает от саши лишь:

$0 : "-c"
$1 : "/usr/lib/openssh/sftp-server"

Причем, получает он лишь путь для запуска sftp-server, не зависимо от параметров, которые юзверь вводит на своей стороне.

Достаточно просто в script-shell запустить sftp-server и он сам уже будет договариваться с клиентом, что там ему нужно.

В моем случае это не подходит.

Так получается, что пользователь testuser на сервере, должен обладать root правами. Или, хотя бы, быть в группе root.

Если отдать на откуп sftp серверу запросы от юзверя, то получется широчайшее поле деятельности:

scp -r testuser@myserver.com:/* c:\coolhackarchive
# или
scp myhack testuser@myserver.com:/etc/cron.d/

Гуляй, рванина! Твори, что хочешь!

Фактически, дать root доступ совершенно левым гражданам к устройству, выполняющие важные задачи.

Потому приходится самому следить за действиями юзверя и дозволять получить лишь то, что для него подготовлено.

А так бы бло здорово отдать все на откуп httpd или sftp-server! Юзверю удобно и мне меньше головной боли. Но, ни-з-з-зя!

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 2)