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

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

sudo: cd: command not found

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

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

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

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

sudo -i

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

cd /path/to/directory

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

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

sudo su# cd /root

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

~ % which cdcd: shell built-in command

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

~ % sudo $SHELL -c "cd name_of_dir"

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

sudo -s

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

cd /root

Или

cd /var/lib/

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

exit

Для выхода из системы с правами суперпользователя.

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

sudo -s && cd /var/lib

Или

sudo -s && cd /root

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

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

  1. Бежать sudo -s, или sudo -i если вам нужна оболочка входа в систему (помните, что один из эффектов sudo -i заключается в том, чтобы запустить вас в домашнем каталоге root), или sudo bash если вы хотите заставить bash или иметь возможность передавать параметры в оболочку.
  2. Бежать cd каталог в новой оболочке.
  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 специально. Бегущий sudo -u пользователь компакт-диск каталог в частности, не поддерживается, хотя вы могли бы расширить функцию оболочки для поддержки этого случая. И не является sudo -i cd каталог. Оболочка, которую он создает, похожа на то, что вы получаете с sudo -s. Код на самом деле не выполняется sudo -s, но использует sudo bash, так что -c опция работает правильно. Это на самом деле работает bash дважды, когда ты проходишь мимо cd и аргумент каталога для него (и ноль раз в противном случае). Когда ты бежишь sudo cd каталог, сначала он отделяет отдельную оболочку bash от той, на которой вы запускаете sudo функция в каталоге и изменения. Если это удастся, это заменяет эта оболочка 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    .profileek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a whileek@Io:~$ sudo cd /root/.local[sudo] password for ek:bash: Running root shell in /root/.localbash: Type "exit" once you are done!root@Io:/root/.local#root@Io:/root/.local#root@Io:/root/.local# exitexitek@Io:~$

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

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

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

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

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

Решение @Daniel Bauke работает, когда то, что вы пытаетесь sudo является составной командой, такой как cd /some/path && ./executableScript.sh что может быть тем, что вам нужно, если executableScript.sh должен быть выполнен из своего каталога, и для этого требуется sudo как для входа в каталог, так и для запуска скрипта (и вы хотите сделать это неинтерактивным / сеансовым способом.

Повторюсь, решение Даниэля Баука заключается в:

sudo $SHELL -c "cd /some/path && ./executableScript.sh"

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

Ответы, приведенные здесь, верны, но вы отвергаете их и говорите, что они неверны. Не просто отвергайте то, что было сказано, из-за чего-то другого, что вы видели.

Это забавно… он хочет, чтобы “sudo cd” работал, но он голосует против решений, использующих sudo или su. Он говорит, что не хочет работать в качестве root, но он все равно хочет получить доступ к сайту, который ему не принадлежит. По-моему, это похоже на тролля…

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

`sudo chmod 0755 name_of_dir; do you business; cd …/; sudo chmod 0700 name_of_dir", похоже, единственный ответ, который вас устроит.

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

@Oli. Я просто высказал свое ЛИЧНОЕ мнение. Если бы я знал другой способ сделать это, я бы не спрашивал об этом здесь. Я ищу его. Как я вижу, это почти невозможно, НО вообще нет ничего невозможного.