Jak wejść do katalogu za pomocą polecenia „cd”, jeśli ma 700 uprawnień i nie jest własnością mnie?

86

Próbowałem użyć, sudo cd name_of_dirale pojawia się komunikat o błędzie:

sudo: cd: command not found

Czy istnieje inny sposób na wejście do katalogu należącego do innego użytkownika, który ma 700 uprawnień?

Bakhtiyor
źródło
2
proszę dodać ls -lsam katalog.
Rinzwind
7
I proszę wyjaśnij, dlaczego ciągle zostawiasz negatywne komentarze w stosunku do prawidłowych odpowiedzi. Jeśli uważasz, że istnieje (lub powinien być) lepszy sposób, daj nam znać, co to może być.
Oli
1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirWydaje się, że to jedyna odpowiedź, z której będziesz zadowolony.
Marco Ceppi
3
Odpowiedzi tutaj podane są poprawne, ale głosujesz na nie i twierdzisz, że się mylą. Nie lekceważ tego, co zostało powiedziane z powodu czegoś innego, co widziałeś.
Richard Holloway,
3
To zabawne ... chce sudo cdpracować, ale głosuje za rozwiązaniami sudo lub su. Mówi, że nie chce pracować jako root, ale nadal chce uzyskać dostęp do bezpośrednio, którego nie posiada. Brzmi dla mnie jak troll ...
MestreLion

Odpowiedzi:

110

sudo cdnie będzie działać, ponieważ cdpolecenie jest wbudowane w powłokę. Mówisz więc o rootowaniu, a następnie uruchom to polecenie. Stajesz się rootem, a następnie wyszukiwane jest polecenie po sudo, ale nie ma cdpolecenia do znalezienia.

Metodą, którą należy zastosować, jest przejście do użytkownika, który jest właścicielem katalogu. Zezwolenie 700oznacza „właściciel może czytać, pisać i wykonywać”.

Więc jeśli root jest właścicielem katalogu sudo -i, hasło, a następnie cd {dir}jest jedyną prawidłową metodą. Jeśli ktoś jest właścicielem katalogu, nadal możesz użyć pierwszej metody, ale możesz także zmienić na tego użytkownika su {username}i używać go cdjako tego użytkownika.

Rinzwind
źródło
Pytanie poboczne: czy root będzie mógł wprowadzić katalog 700, nawet jeśli nie jest właścicielem?
MestreLion
3
tak, MestreLion, 700 nie przestanie się bawić rootowaniem. Uprawnienia „000” powstrzymają użytkownika przed wprowadzeniem się (tak, użytkownik może utworzyć katalog, do którego sam nie może wejść ...), ale nadal root może go wprowadzić.
Rinzwind,
1
echo to wbudowane polecenie powłoki, dlaczego mogę uruchomić „sudo echo”, ale nie „sudo cd”?
shoujs
Przepraszamy, te same zasady dotyczą sudo echo: potrzebujesz czegoś takiego jak echo 'deb {text}' | sudo tee --append {file}użycie echa w sudo i zmiana pliku.
Rinzwind
1
Dlaczego jednak nie jest cdwbudowany w polecenia sudo?
Aaron Franke,
44

sudo -i

aby otworzyć „konsolę główną”, a następnie

cd /path/to/directory

( cdjest wbudowanym poleceniem powłoki, więc nie może być celem sudo)

Vojtech Trefny
źródło
18

Aby otworzyć katalog główny, możemy uruchomić powłokę główną, np .:

sudo su
# cd /root
Takkat
źródło
3
Nie chciałbym pracować jako root. NIGDY!!! Ponadto eksperci zalecają, aby nigdy nie logować się jako root. -1
Bakhtiyor
8
Właśnie dlatego nie chcesz uprawnień do otwierania katalogów root, prawda?
Takkat,
10
W trybie root nie ma nic złego. Eksperci zawsze zalecają rootowanie, gdy jest to potrzebne.
Rinzwind
2
Jeśli pracujesz z rzeczami należącymi do roota, czasami sudo suing (lub inna metoda) jest jedyną praktyczną lub nawet możliwą metodą. „Eksperci” mówią ci tylko, abyś nie używał roota jako nawyku - jest w porządku, kiedy go potrzebujesz. I @Vojtech, nic nie jest niemożliwe ...
Oli
2
@Bakhtiyor: praca przez cały czas jako root naprawdę nie jest zalecana. Wydanie go dla jednego (lub kilku) poleceń jest dopuszczalne. Zwłaszcza jeśli próbujesz wejść do katalogu, do którego użytkownik nie ma uprawnień . Więc musisz być właścicielem lub rootem.
MestreLion,
10

Jak zauważyli inni - ma wbudowaną powłokę:

~ % which cd
cd: shell built-in command

Dlaczego więc nie sudo samej powłoki?

~ % sudo $SHELL -c "cd name_of_dir"
Daniel Bauke
źródło
5
+1 za pomysł sudo bash -c ... i sugestię: unikaj używania which. Jest to tylko skrypt i nie obsługuje wszystkich możliwości (binarnych, wbudowanych, aliasów itp.). Użyj typezamiast tego. O wiele bezpieczniejszy, wydajny i przenośny. I type -pna ścieżkę pliku wykonywalnego.
MestreLion,
1
Cóż, zależy ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(man zshbuiltins)
Daniel Bauke,
1
To nie zależy. whencejest- zshtylko ... nie działa w bash, nie jest nawet domyślnie instalowany w Ubuntu. Chociaż typejest POSIX , co oznacza, że ​​będzie działał w każdej nowoczesnej powłoce ... bash, csh, ksh .. a nawet zsh.
MestreLion
Jasne, że tak i dlatego głosowałem twój komentarz właśnie wtedy, gdy się pojawił, ale miałem na myśli to, że w Zsh tak naprawdę nie jest to skrypt i daje podobne wyniki, typeponieważ oba są aliasami tego samego polecenia.
Daniel Bauke,
Oh teraz rozumiem. Cóż, ale to już koniec zsh. W bash, która jest domyślną (i zwykle jedyną) powłoką terminala w Ubuntu, whichnie jest wbudowana ... więc type(lub type -p) jest preferowana.
MestreLion
4

Możesz także podnieść się do rootowania użytkownika poprzez:

sudo -s

Następnie możesz cd do dowolnego katalogu, który nie pozwala zwykłemu użytkownikowi na:

cd /root

Lub

cd /var/lib/

Następnie po zakończeniu wpisz:

exit

Aby wylogować się z uprawnień użytkownika root.

Aby wynieść się jako root, możesz również połączyć dwa polecenia &&operatora, jak poniżej, operator ten zachowuje również sekwencję wykonywania, jeśli bieżące polecenie wykona się pomyślnie i tylko wtedy można wykonać następne polecenie:

sudo -s && cd /var/lib

Lub

sudo -s && cd /root
Vicky Dev
źródło
2

Jeśli naprawdę chcesz działać, możesz zdefiniować funkcję powłoki o nazwie, która uruchamia nową powłokę główną podczas uruchamiania w ten sposób, i po prostu uruchamia zwykłe polecenie w przeciwnym razie.sudo cd directorybashsudosudo

Jak przedstawiono w innych odpowiedziach, większość użytkowników nie będzie chciała tego robić, ale zamiast tego będzie chciała:

  1. Uruchom sudo -slub sudo -ijeśli chcesz powłoki logowania (pamiętaj, że jednym z efektów sudo -ijest uruchomienie Cię w katalogu głównym root) lub sudo bashjeśli chcesz wymusić bashlub móc przekazać opcje do powłoki.
  2. Uruchom w nowej powłoce.cd directory
  3. Wykonaj dowolne (inne) działania, które należy podjąć jako root w nowej powłoce.
  4. Po zakończeniu biegnij, exitaby opuścić nową powłokę. Ważne jest, aby nie zapominać o tym, ponieważ nie chcesz wykonywać większej liczby akcji jako root niż planujesz!

Tak więc, jeśli chcesz, możesz napisać funkcję powłoki (lub skrypt), która wykonuje dwie pierwsze z tych akcji, sudoa następnie normalnie cddziała sudoinaczej. Nie używaj tego jako alternatywy dla dowiedzenia się, dlaczego sudo cd inaczej się nie powiedzie , ponieważ jeśli nie rozumiesz, co się dzieje, prawdopodobnie będziesz bardzo zdezorientowany, będąc w nowej powłoce (i możesz nie zrozumieć żadnych komunikatów o błędach które występują).

Oto jeden ze sposobów na napisanie takiej funkcji powłoki, która również przypomina, że ​​jesteś w nowej powłoce i że powinieneś exitz niej wyjść po zakończeniu. (Przypominamy, że prawdopodobnie będzie przydatna dla użytkowników dowolnym poziomie umiejętności, bo nie jest na ogół przyzwyczajeni do bycia w nowej powłoce, gdy jeden pracuje sudobez -s, -ilub nazwa rzeczywistej muszli jako argument).

# 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
}

Możesz umieścić to w swoim ~/.bashrc, choć jest to na tyle dziwny sposób, sudoże możesz chcieć to włączać tylko od czasu do czasu. W takim przypadku lepiej jest umieścić go we własnym pliku. Jeśli utworzysz plik o nazwie sudo.bashw katalogu domowym z tą zawartością, możesz udostępnić sudofunkcję - aby działała zamiast zwykłego sudopolecenia - uruchamiając . ~/sudo.bash. Działa to w bieżącej powłoce i jej podrzędnych powłokach, ale nie w innych. Z tego samego powodu, że pliki jak .bashrcnie są wykonywalne, nie oznaczają sudo.bashwykonywalny chmod. To naprawdę biblioteka, a nie samodzielny skrypt powłoki. Jeśli takuruchom go jako skrypt powłoki, zdefiniuje funkcję ... ale tylko w powłoce, która uruchomiła skrypt, a nie dla ciebie jako wywołującego. (Oczywiście, można napisać skrypt, za to, że po prostu nie zdarza się być podejście Wziąłem tutaj).

Aby sprawdzić, czy sudojest obecnie zdefiniowana jako funkcja powłoki, i zobaczyć jej bieżącą definicję, jeśli jest to jedna, uruchom type sudo. Aby wyłączyć (tzn. Cofnąć definicję) funkcję po jej zdefiniowaniu, uruchom unset -f sudo. Aby ręcznie uruchomić zwykłe sudopolecenie bezpośrednio, nawet jeśli funkcja powłoki jest zdefiniowana, uruchom command sudo. Zauważ jednak, że nie musisz tego robić, ponieważ ta sudofunkcja faktycznie robi to sama, ilekroć przesłano do niej więcej lub mniej niż dwa argumenty lub pierwszy przekazany argument jest inny cd. Dlatego nadal możesz go używać w zwykły sposób, z którego korzystają ludzie sudo.

Zauważ również, że funkcja powłoki pokazana powyżej nadal pozwala ci przekazywać inne argumenty sudo, ale uniemożliwi to jej cdspecjalne traktowanie . Uruchomiony w szczególności nie jest obsługiwany, choć można rozszerzyć funkcję powłoki na poparcie tej sprawy. Ani nie jest . Powłoka, którą tworzy, jest podobna do tego, co dostajesz . Kod tak naprawdę nie działa , ale używa , więc opcja działa poprawnie. W rzeczywistości działa dwa razy, gdy przekazujesz i argument katalogu (w przeciwnym razie zero razy). Po uruchomieniu najpierw uruchamia oddzielną powłokę bash od tej, w której uruchamiasz funkcję, i zmienia katalog. Jeśli to się powiedzie, zastępujesudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo tę powłokę bashową z nową, interaktywną, której możesz użyć.

Oto przykład, w jaki sposób ta funkcja powłoki automatycznie „robi właściwą rzecz”. Zauważ, że sudo ls -A /rootzachowuje się normalnie. Dopiero wtedy, gdy próbuję wejść cddo katalogu sudo, tworzona jest nowa powłoka i wyraźnie przypomina mi się, co się dzieje.

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:~$

Jeśli spróbujesz przejść sudo cddo katalogu, do którego nie możesz zmienić nawet jako root, pojawi się komunikat o błędzie:

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:~$

Użyłem sudo -kpomiędzy wywołaniami w powyższych przykładach, aby pokazać, że uwierzytelnia cię jako root przed próbą zmiany katalogu. Ale tak naprawdę nie musisz sudo -ksam biegać . Ponieważ funkcja powłoki jest tylko cienkim opakowaniem dla prawdziwego sudopolecenia , buforowanie poświadczeń i inne typowe sudozachowania nadal działają normalnie.

Chociaż działa dobrze i jest całkiem fajny, przyznaję, że cieniowanie prawdziwego sudopolecenia funkcją o tej samej nazwie jest super dziwne. Większość użytkowników prawdopodobnie po prostu chcą wykonać czynności sudo -s, sami. Ale na wypadek, gdyby ktoś tego chciał - a także wykazał, że jest to możliwe - jest.cd directory

Eliah Kagan
źródło
0

Jeśli chodzi suo sudebatę lub nie , myślę, że to głupie. sujest przeciwko religii Ubuntu i nie jest to coś nierozważnego. To niesamowite, co rm -rf *możesz zrobić, jeśli jesteś rootem. Ale jeśli nie masz ochoty korzystać z interfejsu wiersza poleceń (CLI) i masz do wykonania zadania na poziomie systemu, nie ma powodu, aby z niego nie korzystać su. Użyłem kilku dystrybucji, o których nikt nawet nie wspomniał sudo. To tylko kwestia rodzaju pracy i metody, z której czujesz się najlepiej. Używam obu.

Joe
źródło
1
„W wersjach bash i sudoja z kubuntu lucid, sudo cdteraz działa - bez żadnych obejść”. Brakuje czegoś takiego , co, jestem pewien, że nigdy nie było domyślnie w Ubuntu, nie wiem jak. (Użyłem też 10.04; tego nie zrobiłem.) Minęły lata, odkąd to opublikowałeś, ale pamiętasz szczegóły? Czy sudo cdnadal pracować dla Ciebie? Jaki jest wynik działania type -a sudopowłoki, w której działa? Rozumiem, że możesz nie wiedzieć - a druga część twojej odpowiedzi pozostaje aktualna - ale jeśli tak, możesz ją edytować .
Eliah Kagan,
@EliahKagan To zdecydowanie nie działa teraz dla mnie w 16.10 i nie pamiętam, co wtedy zrobiłem. Modyfikowanie istniejących podstawowych poleceń jest sprzeczne z moją religią, więc nie jest prawdopodobne, że to zrobiłem. W każdym razie, nawet gdyby zadziałało, wszyscy nazwaliby to złym nawykiem, ponieważ ogólnie nie działałoby.
Joe