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


87

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

sudo: cd: command not found

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


2
пожалуйста, добавьте ls -lсамого каталога.
Rinzwind

7
И, пожалуйста, объясните, почему вы продолжаете оставлять отрицательные комментарии против действительных ответов здесь. Если вы считаете, что есть (или должны быть) лучший способ, сообщите нам, что это может быть.
Оли

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirКажется, это единственный ответ, который вас порадует.
Марко Чеппи

3
Ответы, приведенные здесь, верны, но вы голосуете за них и говорите, что они неправильные. Не просто пренебрегайте тем, что говорится, из-за чего-то еще, что вы видели.
Ричард Холлоуэй

3
Это забавно ... он хочет sudo cdработать, но он голосует за решения, используя sudo или su. Он говорит, что не хочет работать с правами root, но все равно хочет получить доступ к тому, чем он не владеет. Звучит как тролль для меня ...
MestreLion

Ответы:


111

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

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

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


Дополнительный вопрос: сможет ли root ввести 700 dir, даже если он не является владельцем?
МестреЛион

3
да MestreLion, 700 не помешает руту войти. Разрешения «000» не позволят пользователю войти в себя (да, пользователь может создать каталог, в который он сам не может войти ...), но все же root может войти в него.
Rinzwind

1
echo - это встроенная команда оболочки, почему я могу запустить "sudo echo", но не "sudo cd"?
shoujs

Извините, применяются те же правила sudo echo: вам нужно что-то вроде echo 'deb {text}' | sudo tee --append {file}использования echo с sudo и для изменения файла.
Rinzwind

1
Почему же он не cdвстроен в доступные команды sudo?
Аарон Франке

44

sudo -i

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

cd /path/to/directory

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


19

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

sudo su
# cd /root

3
Я не хотел бы работать как рут. НИКОГДА!!! А также эксперты рекомендуют никогда не входить в систему как root. -1
Бахтиер

8
Ну, именно поэтому вы не хотите, чтобы разрешения открывали каталоги root, не так ли?
Таккат

10
Нет ничего плохого в том, чтобы войти в корневой режим. Эксперты всегда рекомендуют заходить в root, когда это необходимо.
Rinzwind

2
Если вы работаете с вещами, принадлежащими root, иногда sudo suing (или другой метод) является единственным практическим или даже возможным методом. «Эксперты» только говорят, что вы не должны использовать root как привычку - это нормально, когда вам это действительно нужно. И @Vojtech, нет ничего невозможного ...
Оли

2
@Bakhtiyor: работать все время как root действительно не рекомендуется. Но выдача для одной (или нескольких) команд приемлема. Особенно, если вы пытаетесь ввести каталог, к которому у вашего пользователя нет прав доступа . Таким образом, вы должны быть владельцем или рутом.
MestreLion

10

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

~ % which cd
cd: shell built-in command

Так почему бы тебе не испортить саму оболочку?

~ % sudo $SHELL -c "cd name_of_dir"

5
+1 за идею sudo bash -c ... и предложение: избегайте использования which. Это просто скрипт, и он не будет обрабатывать все возможности (двоичные, встроенные, псевдонимы и т. Д.). Используйте typeвместо этого. Намного безопаснее, мощнее и портативнее. И type -pдля пути исполняемого файла.
MestreLion

1
Ну, зависит ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(мужчина zshbuiltins)
Даниэль Бауке

1
Это не зависит. whenceэто zsh... только ... он не работает в Bash, он даже не установлен по умолчанию в Ubuntu. Хотя typeэто POSIX , то есть он будет работать в любой современной оболочке ... bash, csh, ksh .. и даже zsh.
MestreLion

Конечно, это так, и именно поэтому я одобрил ваш комментарий именно тогда, когда он появился, но я хотел сказать, что в zsh это на самом деле не скрипт и дает схожие результаты, так typeкак оба являются псевдонимами для одной и той же команды.
Даниэль Бауке

О, теперь я понимаю. Ну, вот и все zsh. В bash, которая является стандартной (и обычно единственной) терминальной оболочкой в ​​Ubuntu, whichне является встроенной ... поэтому type(или type -p) предпочтительнее.
MestreLion

4

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

sudo -s

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

cd /root

Или же

cd /var/lib/

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

exit

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

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

sudo -s && cd /var/lib

Или же

sudo -s && cd /root

2

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

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

  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выйти из нее, когда закончите. (Это напоминание, вероятно, будет полезно для пользователей любого уровня квалификации, потому что один в целом не привык быть в новой оболочке , когда один работает sudoбез -s, -iили имя фактической оболочки в качестве аргумента.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    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специально . Запуск , в частности , не поддерживается, хотя вы могли бы расширить функции оболочки , чтобы поддержать этот случай. И нет . Оболочка, которую он создает, похожа на ту, что вы получаете . Код на самом деле не запускается , а использует , поэтому опция работает правильно. На самом деле он запускается дважды, когда вы передаете ему аргумент каталога (и ноль раз в противном случае). Когда вы запускаете , сначала он отделяет отдельную оболочку bash от той, в которой вы запускаете функцию, и меняет каталог. Если это удается, он заменяетsudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo эта оболочка bash с новой интерактивной оболочкой, которую вы можете использовать.

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

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

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

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

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

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


0

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


1
«В версиях bash и sudoу меня с kubuntu lucid sudo cdтеперь работает - без каких-либо обходных путей». Если не считать чего-то подобного, что , я уверен, никогда не было в Ubuntu по умолчанию, я не понимаю, как это сделать. (Кроме того, я использовал 10.04; он этого не делал.) Прошли годы с тех пор, как вы опубликовали это, но помните ли вы детали? У вас sudo cdвсе еще работает? Какой вывод type -a sudoв оболочке, где это работает? Я понимаю, что вы можете не знать - и вторая часть вашего ответа остается актуальной - но если вы это сделаете, вы можете отредактировать об этом.
Элия ​​Каган

@EliahKagan Это определенно не работает для меня сейчас в 16.10, и я не помню, что я тогда сделал. Изменение моей базовой команды противоречит моей религии, поэтому вряд ли я это сделал. В любом случае, даже если бы это сработало, все назвали бы это плохой привычкой, потому что это не сработало бы вообще.
Джо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.