Як ввести каталог з командою 'cd', якщо вона має 700 дозволів і не належить мені?


86

Я намагався використовувати, 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

Відповіді:


110

sudo cdне працюватиме, оскільки cdкоманда вбудована в оболонку. Отже, ви говорите, станьте root і виконайте цю команду. Ви стаєте root, а потім шукаєте команду після sudo, але немає cdкоманди знайти.

Метод, який потрібно використовувати, - це перейти до користувача, якому належить каталог. Дозвіл 700розуміється як "власник може читати, писати та виконувати".

Тож якщо root володіє каталогом sudo -i, паролем і тоді cd {dir}це єдиний правильний метод. Якщо хтось інший є власником каталогу, ви все ще можете скористатись 1-м методом, але ви також можете перейти на цього користувача, su {username}а потім використовувати його cd.


Побічне запитання: чи зможе root ввести 700 dir, навіть якщо він не є власником?
MestreLion

3
так, MestreLion, 700 не зупинить корінь від введення. Дозволи "000" не дозволять користувачеві входити до себе (так, користувач може створити dir, який він сам не може ввести ...), але все ж 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)


18

Для відкриття кореневого каталогу ми можемо запустити кореневу оболонку, наприклад:

sudo su
# cd /root

3
Я не хотів би працювати як корінь. НІКОЛИ !!! А також експерти рекомендують ніколи не входити в систему як корінь. -1
Бахтіор

8
Ну, саме тому ви не хочете, щоб дозволили відкривати каталоги root, чи не так?
Таккат

10
У кореневому режимі немає нічого поганого. Експерти завжди рекомендують запускати корінь, коли він буде необхідний.
Rinzwind

2
Якщо ви працюєте з речами, що належать root, іноді sudo suing (або інший метод) є єдиним практичним або навіть можливим методом. "Експерти" лише кажуть вам не використовувати корінь як звичку - це добре, коли вам це справді потрібно. І @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. Виконайте будь-які (інші) дії, які потрібно взяти за корінь у новій оболонці.
  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 shell з новою, інтерактивною, яку ви можете використовувати.

Ось приклад того, як функція оболонки автоматично "робить правильно". Зауважте, що 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проти релігії Ubuntu, і це не те, що потрібно робити безтурботно. Дивно, що 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.