
Есть ли способ запустить cd
команду с привилегиями суперпользователя, чтобы получить доступ к каталогам, владельцем которых является root? Когда я запускаю sudo cd <path>
, я получаю sudo: cd: command not found
.
решение1
Другой ответ не является неправильным.
Возможно, лучшим ответом будет:
Инструмент sudo предназначен для выполнения действий от имени суперпользователя, а вы описываете нечто, что скорее является изменением состояния, которое будет предшествовать таким действиям, как «ls» или «vi» или другим, чтобы упростить их.
Я предлагаю, например, если вы хотите отредактировать файл в /root/private/:
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
Это определенно требует больше набора текста и немного сложнее, чем просто сменить каталог. Тем не менее, этодалекоболее поддается аудиту и гораздо больше соответствует принципам, лежащим в основе sudo, чем запуск какого-либо варианта «sudo bash».
Если вы работаете в безопасной среде, ваша команда IA будет вам благодарна. Если вы задаетесь вопросом: «Что я изменил на днях?», тотыбудут вам благодарны, потому что вам не придется гадать, какой файл или файлы вы отредактировали.
Все это говорит о том, что включение и выполнение некоторой формы 'sudo bash' определенно проще. Если вы искали более простого, почему вы используете 'sudo' в первую очередь, а не просто входите в систему как root?
решение2
Как вы заметили, cd
это встроенная команда оболочки, иесть причинадля этого: «текущий каталог» — это параметр процесса, который может быть изменен только самим процессомсам.
Рабочий каталог вашей оболочки не может быть изменен никаким дочерним процессом, поэтому даже если вам удастся запуститься cd
в привилегированном подоболочке, изменится только рабочий каталог этой временной подоболочки, и не имеет значения, какой метод повышения привилегий вы используете.
Так что для sudo cd
работы sudo сам по себе должен быть встроенной оболочкой, и ему нужен какой-то способ повысить привилегии уже запущенного процесса. В настоящее время такого механизма нет в Linux (как и в большинстве других операционных систем).
Один из способов достичь желаемого — запуститьинтерактивныйcd
shell с правами root (подойдет любой метод) и просто используйте в нем обычную команду :
[user@host /]$ sudo bash
[root@host /]# cd /root/secret
Если вы хотите сделать все это одной командой, то она должна выглядеть так — сначала измените рабочий каталог, а затем запустите интерактивную оболочку:
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
Примечание: Внешняя команда не обязательно должна быть оболочкой, она просто должна бытьчто-нибудькоторый меняет свой рабочий каталог и выполняет новую команду. В последних системах Linux есть один или два помощника, которые можно использовать:
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
Преимущество этого метода в том, что он не требует вложенных кавычек; вы можете выполнить команду из нескольких слов, не испытывая проблем с пробелами или специальными символами.
Наконец, некоторые программы имеют встроенную возможность изменить свой рабочий каталог:
sudo make -C /etc
sudo git -C /root/secret log
решение3
Самый быстрый способ сделать то, что мне было нужно, был следующим:
sudo -s
Как описано вэтот ответ.