Làm cách nào để nhập một thư mục bằng lệnh 'cd' nếu nó có 700 quyền và không thuộc sở hữu của tôi?


87

Tôi đã cố gắng sử dụng sudo cd name_of_dirnhưng nhận được thông báo lỗi:

sudo: cd: command not found

Có cách nào khác để vào một thư mục thuộc sở hữu của người dùng khác có 700 quyền không?


2
vui lòng thêm một ls -ltrong các thư mục chính nó.
Rinzwind

7
Và hãy giải thích lý do tại sao bạn tiếp tục để lại bình luận tiêu cực chống lại các câu trả lời hợp lệ ở đây. Nếu bạn nghĩ rằng có (hoặc nên) một cách tốt hơn, xin vui lòng cho chúng tôi biết nó có thể là gì.
Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirCó vẻ là câu trả lời duy nhất bạn sẽ hài lòng.
Marco Ceppi

3
Các câu trả lời được đưa ra ở đây là chính xác, nhưng bạn đang bỏ phiếu cho họ và nói rằng họ sai. Đừng bỏ qua những gì đang được nói vì những điều khác mà bạn đã thấy.
Richard Holloway

3
Điều đó thật buồn cười ... anh ấy muốn sudo cdlàm việc, nhưng anh ấy bỏ phiếu giải pháp bằng cách sử dụng sudo hoặc su. Anh ta nói rằng anh ta không muốn làm việc tận gốc, nhưng anh ta vẫn muốn truy cập trực tiếp mà anh ta không sở hữu. Nghe có vẻ như là một trò troll đối với tôi ...
MestreLion

Câu trả lời:


111

sudo cdsẽ không hoạt động vì cdlệnh được tích hợp vào shell. Vì vậy, bạn đang nói trở thành root và sau đó chạy lệnh này. Bạn trở thành root và sau đó lệnh sau khi sudo được tìm kiếm nhưng không có cdlệnh nào để tìm.

Phương pháp sử dụng là chuyển sang người dùng sở hữu thư mục. Quyền 700có nghĩa là "chủ sở hữu có thể đọc, viết và thực thi".

Vì vậy, nếu root sở hữu thư mục sudo -i, mật khẩu và sau đó cd {dir}là phương pháp đúng duy nhất. Nếu người khác sở hữu thư mục, bạn vẫn có thể sử dụng phương thức 1 nhưng cũng có thể thay đổi thành người dùng su {username}đó và sau đó sử dụng cdnhư người dùng đó.


Câu hỏi phụ: liệu root có thể nhập 700 dir ngay cả khi anh ta không phải là chủ sở hữu?
MestreLion

3
vâng, MestreLion, 700 sẽ không ngăn được root. Quyền '000' sẽ ngăn người dùng tự nhập (vâng, người dùng có thể tạo một thư mục mà chính anh ta không thể nhập ...) nhưng root vẫn có thể nhập vào đó.
Rinzwind

1
echo là một lệnh dựng sẵn shell, tại sao tôi có thể chạy "sudo echo" chứ không phải "sudo cd"?
shoujs

Xin lỗi, quy tắc tương tự áp dụng cho sudo echo: bạn cần một cái gì đó như echo 'deb {text}' | sudo tee --append {file}sử dụng echo với sudo và để thay đổi một tập tin.
Rinzwind

1
Tại sao không cdđược tích hợp vào các lệnh có sẵn sudo?
Aaron Franke

44

sudo -i

để mở "root console" và sau đó

cd /path/to/directory

( cdlà một lệnh dựng sẵn shell, vì vậy nó không thể là mục tiêu sudo)


18

Để mở thư mục gốc, chúng tôi có thể chạy shell root, ví dụ:

sudo su
# cd /root

3
Tôi không muốn làm việc như một cái gốc. KHÔNG BAO GIỜ!!! Và các chuyên gia cũng khuyên không bao giờ đăng nhập như một root. -1
Bakhtiyor

8
Vâng, đó chính xác là lý do tại sao bạn không muốn có quyền mở thư mục gốc, phải không?
Takkat

10
Không có gì sai đi vào chế độ root. Các chuyên gia sẽ luôn khuyên bạn nên đi vào root khi nó được thực hiện-.
Rinzwind

2
Nếu bạn đang làm việc với những thứ thuộc sở hữu của root, đôi khi sudo suing (hoặc phương thức khác) là phương pháp thực tế hoặc thậm chí có thể. "Chuyên gia" chỉ bảo bạn không sử dụng root như một thói quen - thật tốt khi bạn thực sự cần nó. Và @Vojtech, không có gì là không thể ...
Oli

2
@Bakhtiyor: làm việc toàn bộ thời gian là root thực sự không được khuyến khích. Nhưng việc phát hành nó cho một lệnh (hoặc một vài) là chấp nhận được. Đặc biệt nếu bạn đang cố gắng nhập một thư mục mà người dùng của bạn không có quyền . Vì vậy, bạn cần phải là chủ sở hữu hoặc root.
MestreLion

10

Như những người khác đã chỉ ra - nó được tích hợp sẵn:

~ % which cd
cd: shell built-in command

Vì vậy, tại sao bạn không sudo vỏ chính nó?

~ % sudo $SHELL -c "cd name_of_dir"

5
+1 cho ý tưởng sudo bash -c ... và một đề xuất: tránh sử dụng which. Nó chỉ là một tập lệnh và nó sẽ không xử lý tất cả các khả năng (nhị phân, dựng sẵn, bí danh, v.v.). Sử dụng typethay thế. An toàn hơn nhiều, mạnh mẽ và di động. Và type -pcho con đường của một thực thi.
MestreLion

1
Chà, phụ thuộc ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(người đàn ông zshbuiltins)
Daniel Bauke

1
không phụ thuộc. whencezsh-only ... nó không hoạt động trong bash, nó thậm chí không được cài đặt theo mặc định trong Ubuntu. Trong khi typePOSIX , có nghĩa là nó sẽ hoạt động trong bất kỳ shell hiện đại nào ... bash, csh, ksh .. và thậm chí cả zsh.
MestreLion

Chắc chắn, đó là lý do tại sao tôi nêu lên nhận xét của bạn khi nó xuất hiện, nhưng điều tôi nghĩ là trong zsh thực sự nó không phải là một tập lệnh và cho kết quả tương tự typevì cả hai đều là bí danh cho cùng một lệnh.
Daniel Bauke

Ồ tôi đã hiểu rồi. Vâng, nhưng đó là trong zsh. Trong bash, vỏ thiết bị đầu cuối mặc định (và thường là duy nhất) trong Ubuntu, whichkhông phải là phần dựng sẵn ... vì vậy type(hoặc type -p) được ưu tiên.
MestreLion

4

Bạn cũng có thể nâng chính mình lên root user bằng cách:

sudo -s

Sau đó, bạn có thể cd vào bất kỳ thư mục nào không cho phép người dùng bình thường như:

cd /root

Hoặc là

cd /var/lib/

Sau đó, bạn đã hoàn thành

exit

Để đăng xuất các đặc quyền người dùng root.

Để nâng cao bản thân như root, bạn cũng có thể kết hợp hai lệnh bằng &&toán tử như bên dưới, toán tử này cũng duy trì chuỗi thực thi của chúng, nếu lệnh hiện tại thực thi thành công và chỉ sau đó lệnh tiếp theo mới được phép thực thi:

sudo -s && cd /var/lib

Hoặc là

sudo -s && cd /root

2

Nếu bạn thực sự muốn thực hiện công việc, bạn có thể định nghĩa một hàm shell được gọi là chạy shell gốc mới khi chạy theo cách đó và chỉ chạy lệnh thông thường khác.sudo cd directorybashsudosudo

Như được trình bày trong các câu trả lời khác, hầu hết người dùng sẽ không muốn làm điều đó, nhưng thay vào đó sẽ muốn:

  1. Chạy sudo -shoặc sudo -inếu bạn muốn có một vỏ đăng nhập (hãy nhớ rằng một tác động của sudo -ilà bắt đầu bạn trong thư mục gốc của root) hoặc sudo bashnếu bạn muốn buộc bashhoặc có thể chuyển các tùy chọn cho trình bao.
  2. Chạy trong vỏ mới.cd directory
  3. Thực hiện bất kỳ hành động nào (khác) cần được thực hiện như root trong shell mới.
  4. Sau khi hoàn thành, chạy exitđể rời khỏi vỏ mới. Điều quan trọng là đừng quên điều này, bởi vì bạn không muốn thực hiện nhiều hành động như root hơn bạn dự định!

Vì vậy, nếu bạn muốn, thì bạn có thể viết hàm shell (hoặc tập lệnh) thực hiện hai hành động đầu tiên khi sudođược theo sau cdvà chỉ chạy sudobình thường. Vui lòng không sử dụng điều này như một cách thay thế để tìm hiểu lý do tại sao sudo cd không thành công , bởi vì nếu bạn không hiểu chuyện gì đang xảy ra, thì bạn có thể sẽ rất bối rối khi ở trong một vỏ mới (và bạn có thể không hiểu bất kỳ thông báo lỗi nào xảy ra).

Đây là một cách để viết một hàm shell như vậy, nó cũng nhắc nhở bạn rằng bạn đang ở trong một shell mới và bạn nên exitthoát khỏi nó khi bạn kết thúc. (Nhắc nhở Đó có thể sẽ hữu ích cho người sử dụng bất kỳ trình độ kỹ năng, bởi vì người ta không nói chung là quen với việc trong một vỏ mới khi một chạy sudomà không cần -s, -ihoặc tên của một vỏ thực tế là một cuộc tranh cã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
}

Bạn có thể đặt cái này vào trong ~/.bashrc, mặc dù đây là một cách đủ kỳ lạ để sử dụng sudomà đôi khi bạn chỉ muốn bật nó. Trong trường hợp đó, tốt hơn là đặt nó trong tập tin riêng của mình. Nếu bạn tạo một tệp được gọi sudo.bashtrong thư mục chính của mình với các nội dung đó, thì bạn có thể sudocung cấp chức năng có sẵn - để nó sẽ chạy thay vì sudolệnh thông thường - bằng cách chạy . ~/sudo.bash. Điều đó có hiệu lực trong lớp vỏ hiện tại và lớp vỏ con của nó, nhưng không phải là lớp vỏ khác. Vì lý do tương tự mà các tệp như .bashrckhông thể thực thi được, đừng đánh dấu sudo.bashthực thi bằng chmod. Đây thực sự là một thư viện, chứ không phải là một kịch bản shell độc lập. Nếu bạn đã làmchạy nó dưới dạng shell script, nó sẽ xác định hàm ... nhưng chỉ trong shell chạy script, không dành cho bạn như người gọi. (Tất nhiên, bạn có thể viết một kịch bản cho việc này, điều đó không xảy ra là cách tiếp cận tôi đã thực hiện ở đây.)

Để kiểm tra và xem nếu sudohiện tại được định nghĩa là hàm shell và để xem định nghĩa hiện tại của nó nếu nó là một, hãy chạy type sudo. Để vô hiệu hóa (nghĩa là xác định) chức năng một khi nó được xác định, hãy chạy unset -f sudo. Để tự chạy sudolệnh thông thường trực tiếp ngay cả khi hàm shell được xác định, hãy chạy command sudo. Tuy nhiên, lưu ý rằng bạn không phải làm điều đó, bởi vì sudohàm này thực sự tự thực hiện bất cứ khi nào có nhiều hơn hoặc ít hơn hai đối số được truyền cho nó hoặc đối số đầu tiên được truyền cho nó là bất cứ điều gì ngoài cd. Đó là lý do tại sao bạn vẫn có thể sử dụng nó theo cách thông thường mà mọi người sử dụng sudo.

Cũng lưu ý rằng hàm shell được hiển thị ở trên vẫn không cho phép bạn chuyển các đối số khác sang sudo, nhưng điều đó sẽ ngăn nó xử lý cdđặc biệt . Chạy đặc biệt không được hỗ trợ, mặc dù bạn có thể mở rộng chức năng shell để hỗ trợ trường hợp đó. Cũng không phải . Vỏ mà nó tạo ra tương tự như những gì bạn nhận được với . Mã không thực sự chạy , nhưng sử dụng , vì vậy tùy chọn hoạt động đúng. Nó thực sự chạy hai lần khi bạn vượt qua và một đối số thư mục cho nó (và không có lần nào khác). Khi bạn chạy , đầu tiên, nó tách ra một bash shell riêng biệt từ cái bạn đang chạy chức năng trong và thay đổi thư mục. Nếu thành công, nó sẽ thay thếsudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo bash shell đó với một cái tương tác mới mà bạn có thể sử dụng.

Dưới đây là một ví dụ về cách chức năng shell đó tự động "thực hiện đúng". Lưu ý rằng sudo ls -A /rootcư xử bình thường. Chỉ khi tôi cố gắng vào cdmột thư mục với sudomột shell mới được tạo và tôi mới được nhắc nhở rõ ràng về những gì đang xảy ra.

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

Nếu bạn cố gắng chuyển sudo cdđến một thư mục mà bạn không thể thay đổi thành gốc, thì bạn sẽ nhận được thông báo lỗi:

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

Tôi đã sử dụng sudo -kở giữa các yêu cầu trong các ví dụ trên để cho thấy rằng nó xác thực bạn là root trước khi thử thay đổi thư mục. Nhưng bạn không thực sự phải tự chạy sudo -k. Vì hàm shell chỉ là một trình bao bọc mỏng cho sudolệnh thực , bộ đệm của thông tin đăng nhập của bạn và các sudohành vi phổ biến khác vẫn hoạt động bình thường.

Mặc dù nó hoạt động tốt và khá gọn gàng, tôi thừa nhận rằng việc che giấu sudolệnh thực sự với một chức năng cùng tên là siêu kỳ lạ. Hầu hết người dùng có thể sẽ chỉ muốn thực hiện các bước sudo -s, chính họ. Nhưng trong trường hợp bất cứ ai cũng muốn điều này - và cũng để chứng minh rằng nó có thể - nó đây.cd directory


0

Theo như có suhay không sutranh luận, tôi nghĩ điều đó thật ngớ ngẩn. suchống lại tôn giáo của Ubuntu và đó không phải là điều gì để làm bất cẩn. Thật đáng kinh ngạc những gì một người rm -rf *có thể làm nếu bạn root. Nhưng, nếu bạn cảm thấy thoải mái với giao diện dòng lệnh (CLI) và có các nhiệm vụ cấp hệ thống để thực hiện, không có lý do gì để không sử dụng su. Tôi đã sử dụng một số distro mà không ai đề cập đến bằng cách sử dụng sudo. Đó chỉ là vấn đề bạn đang làm loại công việc nào và phương pháp nào bạn thấy thoải mái nhất. Tôi sử dụng cả hai.


1
"Trong các phiên bản của bash và sudotôi có với kubfox lucid, sudo cdgiờ đã hoạt động - không có bất kỳ cách giải quyết nào." Thiếu một cái gì đó tương tự , mà tôi khá chắc chắn chưa bao giờ có trong Ubuntu, tôi không thấy thế nào. (Ngoài ra, tôi đã sử dụng 10.04; nó đã không làm điều đó.) Đã nhiều năm kể từ khi bạn đăng bài này, nhưng bạn có nhớ các chi tiết không? Liệu sudo cdvẫn làm việc cho bạn? Sản lượng của type -a sudomột cái vỏ nơi nó hoạt động là gì? Tôi hiểu bạn có thể không biết - và phần thứ hai trong câu trả lời của bạn vẫn có liên quan - nhưng nếu bạn làm thế, bạn có thể chỉnh sửa về nó.
Eliah Kagan

@EliahKagan Nó chắc chắn không hoạt động với tôi bây giờ vào 16.10 và tôi không nhớ những gì tôi đã làm sau đó. Nó chống lại tôn giáo của tôi để sửa đổi các lệnh cơ sở hiện có, vì vậy tôi không thể làm điều đó. Trong mọi trường hợp, ngay cả khi nó đã hoạt động, mọi người sẽ chỉ gọi đó là thói quen xấu vì nó thường không hoạt động.
Joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.