Это потому, что :
входит в список символов, которые readline
рассматривают как разделители слов для завершения слов (, которые bash
отображаются в переменной оболочки $COMP_WORDBREAKS
).
После:
COMP_WORDBREAKS=${COMP_WORDBREAKS/:}
(чтобы убрать :
из $COMP_WORDBREAKS
), Ctrl + X*должно работать.
Кто-то может возразить, что :
не должен быть в этом списке в первую очередь именно по той причине, что он используется в классах символов, но я полагаю, причина в том, что вы хотите иметь возможность использовать завершение для таких вещей, как:
PATH=~/bin:/usr/locTab
И этот механизм слишком грубый (вы заметите, что Ctrl + X*на 'a'*
не работает, даже если вы удалите '
из $COMP_WORDBREAKS
), чтобы приспособить оба, так что это компромисс. См. zsh
, оболочку с гораздо более продвинутыми возможностями редактирования, которая здесь работает в обоих случаях.
Не совсем понятно, чего именно вы пытаетесь достичь. Судя по вашему вопросу, вы можете быть:
/etc/passwd
или, точнее, сgetent passwd
)CAP_SETUID
Если одно из первых двух, то вы можете просто создать исполняемый файл с установленными битами setuid
и setgid
и установить для исполняемого пользователя и группы произвольное число. Вам даже не нужно компилировать собственный исполняемый файл, просто скопируйте существующий.
Как root:
mkdir test_dir
# Secure the directory to prevent tampering by other users
chmod go-rx test_dir
cd test_dir
cp $(which bash).
# arbitrary user 1997 group 1998
chown 1997:1998./bash
chmod ug+s./bash
chmod go+rx./bash
# Run touch as an arbitrary user
./bash -p -c `touch /tmp/test_file`
# Check the result
ls -lh /tmp/test_file
-rw-r----- 1 1997 1998 0 Jan 11 08:22 /tmp/test_file
Кроме того, Python (скриптовый язык программирования )доступен на многих платформах. Вы можете написать очень короткий скрипт на Python для запуска чего-либо после вызова setuid и setgid :
.например, uid.py:
import os
import sys
import subprocess
# Set uid and gid
os.setuid(int(sys.argv[1]))
os.setgid(int(sys.argv[2]))
# Run the given command, passing in remaining arguments.
subprocess.run(*sys.argv[3:])
Затем, с CAP_SETUID
данным python, вы можете:
python setuid.py 1997 1998 touch /tmp/test_file
Это будет иметь тот же эффект, что и запуск touch
с uid 1997 и gid 1998.
Обратите внимание, что скрипты python не нужно создавать в виде файлов, их можно передавать в строке:https://stackoverflow.com/a/16938013/453851