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

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

sudo: cd: command not found

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

88
задан 10 December 2017 в 16:03

8 ответов

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

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

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

112
ответ дан 22 November 2019 в 23:10

sudo -i

открыть "root console" и затем

cd /path/to/directory

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

45
ответ дан 22 November 2019 в 23:10

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

sudo su
# cd /root
19
ответ дан 22 November 2019 в 23:10

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

~ % which cd
cd: shell built-in command

Так, почему не делают Вас sudo сама оболочка?

~ % sudo $SHELL -c "cd name_of_dir"
10
ответ дан 22 November 2019 в 23:10

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

sudo -s

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

cd /root

Или

cd /var/lib/

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

exit

К выходу из системы полномочий пользователя root.

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

sudo -s && cd /var/lib

Или

sudo -s && cd /root
4
ответ дан 22 November 2019 в 23:10

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

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

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

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

Вот пример того, как та функция оболочки автоматически "делает правильную вещь". Заметьте это 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 к каталогу, который Вы не можете изменить на то, как раз когда корень, затем Вы просто получите сообщение об ошибке:

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 промежуточные вызовы в вышеупомянутых примерах, чтобы показать, что это аутентифицирует Вас как корень прежде, чем попытаться изменить каталог. Но Вы не должны на самом деле работать sudo -k самостоятельно. Поскольку функция оболочки является просто тонкой оберткой для реального sudo команда, кэширование Ваших учетных данных и другого общего sudo поведения все еще обычно работают.

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

2
ответ дан 22 November 2019 в 23:10

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

0
ответ дан 22 November 2019 в 23:10

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

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

sudo $SHELL -c "cd /some/path && ./executableScript.sh"
0
ответ дан 31 January 2020 в 20:47

Другие вопросы по тегам:

Похожие вопросы: