Как я могу обернуть разумный текстовый файл скриптом Bash, который позволяет каждому пользователю использовать $ USER?

259
Pavel

Итак, у меня есть файл, в data.txtкотором хранится имя пользователя и некоторые данные, по одной строке на пользователя. Я хотел бы иметь скрипт Bash, который может быть запущен пользователями и позволяет им вызывать

grep -w "^$USER" data.txt 

чтобы получить их часть информации, но не в состоянии прочитать все data.txt. Есть ли какой-нибудь простой трюк с этим?

Не должен быть Bash, любой C или Perl-решение подойдет.

0
Извини, я не понимаю. Хотите привести короткий пример? Pavel 8 лет назад 0
Извините, все еще не имеет смысла для меня. Суть в том, что скрипт будет использовать grep под своим именем пользователя в файле, который я не хочу, чтобы он был читаем для них в целом (они могут открыть скрипт и посмотреть, где находится `data.txt`) Pavel 8 лет назад 0

1 ответ на вопрос

0
Kamil Maciorowski

Это решение с использованием скриптов Bash.

Я предполагаю, что вы не можете использовать УИП для скриптов, как описано в этом U & L ответ . Совет в том, чтобы использовать

обертка, которая дезинфицирует окружающую среду (например, sudoс env_resetопцией).


В этом примере я использую /etc/our_secrets.txtвместо data.txt. Сначала ограничьте доступ к файлу:

sudo chown root: /etc/our_secrets.txt sudo chmod 600 /etc/our_secrets.txt 

Затем создайте скрипт /usr/local/sbin/sget_my_secret. Это скрипт:

#!/bin/sh exec /bin/grep -w "^$SUDO_USER" /etc/our_secrets.txt 

И его разрешения:

sudo chown root: /usr/local/sbin/sget_my_secret sudo chmod 744 /usr/local/sbin/sget_my_secret 

Теперь вы должны запустить sudo visudoи изменить свой sudoersфайл, чтобы позволить пользователям вызывать sudo /usr/local/sbin/sget_my_secret. Самый простой способ - это добавить

ALL ALL=(ALL) NOPASSWD: /usr/local/sbin/sget_my_secret 

в файл. Теперь любой пользователь может запустить sudo sget_my_secret. Для удобства вам нужен еще один скрипт /usr/local/bin/get_my_secret:

#!/bin/sh exec /usr/bin/sudo /usr/local/sbin/sget_my_secret 

Его разрешения:

sudo chown root: /usr/local/bin/get_my_secret sudo chmod 755 /usr/local/bin/get_my_secret 

В этот момент любой пользователь может запустить, get_my_secretчтобы получить свою часть информации (если таковая имеется). Вот что происходит:

  1. get_my_secret работает с обычными разрешениями.
  2. Он пытается бежать sudo /usr/local/sbin/sget_my_secret.
  3. sudoers Файл говорит, что может сделать это.
  4. sget_my_secret запускается с повышенными разрешениями.
  5. Повышенный grepобрабатывает файл.

Примечания по безопасности:

  • В моем Debian упомянутая env_resetопция включена по умолчанию.
  • Вы можете заменить эту ALL ALL=(ALL) ...строку на более строгую.
  • В сценариях я использую полные пути везде, где могу.
  • Любой, кто умеет бегать sget_my_secretсо спуфингом $SUDO_USER, может получить чужой секрет. Я думаю, что если вы можете сделать это, вы также можете читать our_secrets.txtнапрямую.
  • Вы можете подумать, что можете позволить пользователям запускаться sudo grep; но это позволит им grepдля чего угодно в любом файле! Смысл в том sget_my_secret, чтобы добавить в этот файл только один специализированный исполняемый sudoersфайл.

Похожие вопросы