Как ввести каталог с командой «cd», если он имеет разрешение 700 и не принадлежит мне?

43

Я попытался использовать sudo cd name_of_dir , но получаю сообщение об ошибке:

sudo: cd: command not found

Есть ли другой способ войти в каталог, принадлежащий другому пользователю, который имеет разрешение 700?

    
задан Bakhtiyor 19.08.2011 в 12:43
источник

7 ответов

66

sudo cd не будет работать, потому что команда cd встроена в оболочку. Итак, вы говорите, что станете root, а затем выполните эту команду. Вы становитесь root, а затем команда после поиска sudo, но не существует команды cd для поиска.

Используемый метод заключается в том, чтобы переключиться на пользователя, которому принадлежит каталог. Разрешение 700 означает, что «владелец может читать, писать и исполнять».

Итак, если root принадлежит каталог sudo -i , пароль, а затем cd {dir} - единственный правильный метод. Если кому-то принадлежит каталог, вы все равно можете использовать 1-й метод, но также можете изменить его на su {username} , а затем использовать cd в качестве этого пользователя.     

ответ дан Rinzwind 19.08.2011 в 13:27
источник
24

sudo -i

, чтобы открыть «корневую консоль», а затем

cd /path/to/directory

( cd - встроенная команда оболочки, поэтому она не может быть целью sudo)

    
ответ дан Vojtech Trefny 19.08.2011 в 12:57
15

Чтобы открыть корневой каталог, мы можем запустить корневую оболочку, например:

sudo su
# cd /root
    
ответ дан Takkat 19.08.2011 в 12:55
6

Как указывали другие - это встроенная оболочка:

~ % which cd
cd: shell built-in command

Итак, почему бы вам не sudo самой оболочке?

~ % sudo $SHELL -c "cd name_of_dir"
    
ответ дан Daniel Bauke 19.08.2011 в 20:52
3

Вы также можете поднять себя на пользователя root:

sudo -s

Затем вы можете записывать cd в любой каталог, который не позволяет обычным пользователям:

cd /root

или

cd /var/lib/

Затем после того, как вы закончите, введите:

exit

Чтобы выйти из привилегий пользователя root.

Для того, чтобы поднять себя как root, вы можете также объединить две команды с помощью оператора && , как показано ниже, этот оператор также поддерживает свою последовательность выполнения, если текущая команда выполняется успешно, и только после этого следующая команда может быть выполнена:

sudo -s && cd /var/lib

или

sudo -s && cd /root
    
ответ дан Vicky Dev 05.10.2016 в 07:15
1

Если вы действительно хотите, чтобы работа sudo cd directory работала, вы можете определить функцию bash shell, называемую sudo , которая запускает новую корневую оболочку при ее запуске и просто запускает обычную команду sudo в противном случае.

Как представлено в других ответах, большинство пользователей not хотят это делать, но вместо этого захотят:

  1. Запустите sudo -s или sudo -i , если вы хотите использовать оболочку входа в систему (помните, что один эффект sudo -i - это запуск в корневом каталоге root) или sudo bash , если вы хотите заставить bash или иметь возможность передавать параметры в оболочку.
  2. Запустите cd directory в новой оболочке.
  3. Выполните любые (другие) действия, которые необходимо предпринять как root в новой оболочке.
  4. После выполнения запустите exit , чтобы оставить новую оболочку. Важно не забывать об этом, потому что вы не хотите выполнять больше действий как root, чем планируете!

Итак, если вы хотите, тогда вы можете написать функцию оболочки (или скрипт), которая выполняет первые два из этих действий, когда sudo сопровождается cd и просто запускает sudo в противном случае. Пожалуйста, не используйте это как альтернативу обучению почему sudo cd не делает другого успеха , потому что, если вы не понимаете, что происходит, тогда вы, вероятно, будете очень смущенный тем, что он находится в новой оболочке (и вы не можете понять какие-либо сообщения об ошибках).

Вот один из способов написать такую ​​функцию оболочки, которая также напоминает вам, что вы находитесь в новой оболочке и что вы должны exit из нее, когда вы закончите. (Это напоминание, вероятно, будет полезно для пользователей уровня any , потому что обычно вы не привыкли к тому, чтобы быть в новой оболочке, когда вы запускаете sudo без -s , -i или имя фактической оболочки в качестве аргумента.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "" = 'cd' ]; then
        sudo bash -c '
                if cd -- ""; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "
[email protected]:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
[email protected]:~$ sudo -k  # invalidates my current timestamp... like I left for a while
[email protected]:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
[email protected]:/root/.local#
[email protected]:/root/.local#
[email protected]:/root/.local# exit
exit
[email protected]:~$
" "$USER" "" >&2 printf "%s: Type \"exit\" once you are done!\n" "
[email protected]:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
[email protected]:~$ sudo -k
[email protected]:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
[email protected]:~$
" >&2 exec bash # Replace this bash shell with an interactive one. fi ' bash _ "" # Use as the dir in the intermediate shell, too. else command sudo "[email protected]" fi }

Вы можете поместить это в свой ~/.bashrc , хотя это довольно странный способ использования sudo , который вы можете только захотеть включить его изредка. В этом случае лучше поместить его в свой файл. Если вы создадите файл с именем sudo.bash в своем домашнем каталоге с этим содержимым, вы можете сделать доступную функцию sudo , чтобы она выполнялась вместо обычной команды sudo , запустив . ~/sudo.bash . Это вступает в силу в текущей оболочке и ее дочерних оболочках, но не в других. По той же причине, что файлы, такие как .bashrc , не исполняются, не отмечайте sudo.bash исполняемый с chmod . Это действительно библиотека, а не отдельный сценарий оболочки. Если вы сделали запустили его как скрипт оболочки, он определит функцию ... но только в оболочке, которая запускала сценарий, а не для вас как вызывающего. (Конечно, вы можете написать сценарий для этого, это просто не тот подход, который я здесь сделал.)

Чтобы проверить, отображается ли sudo в качестве функции оболочки, и посмотреть его текущее определение, если оно равно единице, запустите type sudo . Чтобы отключить (т. Е. Не определить) функцию после ее определения, запустите unset -f sudo . Чтобы вручную запустить регулярную команду sudo напрямую, даже если определена функция оболочки, запустите command sudo . Обратите внимание, однако, что для этого не существует , потому что эта функция sudo фактически выполняет это сам, когда к нему передаются более или менее двух аргументов или переданного ему первого аргумента это ничего, кроме cd . Вот почему вы все еще можете использовать его обычным способом, когда люди используют sudo .

Обратите внимание, что приведенная выше функция оболочки все же позволяет передавать другие аргументы в sudo , , но это предотвратит обработку cd специально . Выполнение sudo -u user cd directory , в частности, не поддерживается, хотя вы можете расширить функцию оболочки для поддержки этого случая. Также не sudo -i cd directory . Созданная оболочка похожа на то, что вы получаете с sudo -s . Код фактически не запускает sudo -s , но использует sudo bash , поэтому параметр -c работает правильно. Он фактически запускает bash дважды, когда вы передаете cd и аргумент каталога к нему (и в противном случае - в нулевое время). Когда вы запускаете sudo cd directory , сначала он отбрасывает отдельную оболочку bash из той, в которой вы используете функцию sudo , и меняет каталог. Если это удастся, он заменяет ту оболочку bash новым, интерактивным, который вы можете использовать.

Вот пример того, как эта функция оболочки автоматически «делает правильную вещь». Обратите внимание, что sudo ls -A /root ведет себя нормально. Только тогда, когда я пытаюсь выполнить cd в каталоге с sudo , создается новая оболочка, и я явно нахожу, что происходит.

%pre%

Если вы попытаетесь использовать sudo cd в каталоге, который вы не можете изменить даже с правами root, тогда вы получите сообщение об ошибке:

%pre%

Я использовал sudo -k между вызовами в приведенных выше примерах, чтобы показать, что он аутентифицирует вас как root до , пытающегося сменить каталог. Но вам фактически не нужно запускать sudo -k . Поскольку функция оболочки - всего лишь тонкая оболочка для реальной команды sudo , кэширование ваших учетных данных и других общих действий sudo по-прежнему работает нормально.

Хотя он работает хорошо и довольно аккуратно, я признаю, что затенение реальной команды sudo с функцией с тем же именем супер странно. Большинство пользователей, вероятно, просто захотят выполнить шаги sudo -s , cd directory . Но в случае, если кто-то захочет этого, а также продемонстрировать, что это возможно - вот оно.

    
ответ дан Eliah Kagan 11.12.2017 в 01:04
0

Что касается обсуждения su или не в su , я думаю, что это глупо. su против религии Ubuntu, и это не то, что нужно делать небрежно. Удивительно, что rm -rf * может сделать, если вы root. Но если вам удобно работать с интерфейсом командной строки (CLI) и выполнять задачи системного уровня, нет причин не использовать su . Я использовал несколько дистрибутивов, о которых никто даже не упоминал, используя sudo . Речь идет только о том, какую работу вы делаете и какой метод вам больше всего нравится. Я использую оба.

    
ответ дан Joe 25.08.2011 в 07:34