Tạo shell mặc định zsh mà không cần quyền truy cập root


52

Tôi đang sử dụng máy tính của trường tôi và muốn sử dụng zshthay vì bash. Tôi muốn biến nó thành shell mặc định, nhưng tôi không thể chạy một lệnh như $ chsh -s $(which zsh)vì tôi không có đặc quyền quản trị viên.

Có cách nào để tôi có thể đặt thứ gì đó trong tôi .bashrchoặc thứ gì đó tự động gọi zshkhi nó mở ra như một cách giải quyết không?

Để làm rõ, zshđã được cài đặt.


2
Có, chỉ cần thêm zshvào .bashrctập tin. Đăng xuất và đăng nhập và thực hiện!
fedorqui

Xin lỗi vì điều đó. Nhưng để kết thúc câu hỏi, tôi chỉ đặt zshdòng đầu tiên?

3
Đặt zsh trong .bashrc sẽ khiến nó luôn luôn thực thi ngay cả khi bashđược gọi rõ ràng. .bash_profileThay vào đó tốt hơn đặt nó vào .
konsolebox

Bạn có thể đặt zsh làm vỏ mặc định của mình trong tùy chọn thiết bị đầu cuối (tạo cấu hình mới).
lmaooooo

Câu trả lời:


68

Tạo .bash_profiletrong thư mục nhà của bạn và thêm các dòng sau:

export SHELL=/bin/zsh
exec /bin/zsh -l

Cập nhật: .profilecó thể hoạt động như một giải pháp chung khi shell mặc định không phải là bash. Tôi không chắc .profilecó thể được Zsh gọi hay không vì nó có thể bị dư thừa nhưng chúng tôi có thể thực hiện một cách an toàn với một kiểm tra đơn giản:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

Chúng ta cũng có thể sử dụng whichđể có được đường dẫn động zshdựa trên giá trị của $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

Điều gì sẽ xảy ra nếu một quản trị viên Linux (root) thay đổi shell mặc định của bạn thành một thứ khác ngoài bash (nhưng không phải zsh), ví dụ như ksh? Sau đó .bash_profilesẽ không được tham khảo. Làm thế nào về việc đưa điều này vào .profilethay thế?
Joshua Huber

@JoshuaHuber Thử nghiệm cuối cùng tôi đã thực hiện, .profileđã không hoạt động. Cũng sẽ không .profileđược gọi bởi Zsh? Nó có thể đi dư thừa. Chưa kiểm tra mà mặc dù. (Cập nhật: Nó đã hoạt động ngay bây giờ, không chắc tôi đã mắc lỗi gì trước đây.) Bạn có suy nghĩ gì về những hạn chế có thể xảy ra khi sử dụng .profilekhông?
konsolebox

1
@konsolebox Bash chỉ có nguồn .profilenếu .bash_profilekhông tồn tại (tất nhiên trừ khi bạn tự lấy nguồn từ đó .bash_profile). Cụ thể, nguồn bash cái đầu tiên của các tập tin [ .bash_profile> .bash_login> .profile] nó tìm thấy. Nó chỉ tìm kiếm .profilenhư một tính năng tương thích POSIX (vỏ Bourne).
pyrocrasty

@pyrocrasty Thật vậy. Như đã nói trong hướng dẫn: "Sau khi đọc tệp đó, nó tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, và đọc và thực thi các lệnh từ tệp đầu tiên tồn tại và có thể đọc được . "
konsolebox

Nó hoạt động để thiết lập một cấu hình thiết bị đầu cuối mới với lệnh Run tùy chỉnh thay vì shell của tôi được đổi thành zsh. .bash_profile.profilekhông hoạt động (các tệp thậm chí không được thực thi, Fedora 26 trên máy tính của trường đại học).
lmaooooo

12

Thông thường bạn có thể sử dụng chshnhư một người dùng không root. Nhưng đôi khi nó bị vô hiệu hóa, thường là trong các trang web sử dụng một số dạng cơ sở dữ liệu người dùng được nối mạng như NIS và LDAP. Thay vào đó, có thể có ypchsh(NIS) hoặc chsh.ldap(LDAP).

chshcũng sẽ thường chỉ cho phép một số vỏ được phê duyệt , thường là những cái được liệt kê trong /etc/shells.

Nếu bạn không thể sử dụng chshhoặc các biến thể của nó tại trang web của mình, thì hãy sắp xếp cho vỏ đăng nhập execcủa bạn vào vỏ yêu thích của bạn và đặt SHELLbiến để trỏ đến vỏ yêu thích của bạn.

  • Nếu shell đăng nhập của bạn là sh, dashhoặc ksh: tệp bạn cần chỉnh sửa là ~/.profile. Lưu ý rằng tệp này được đọc vào đầu phiên tương tác cũng như bởi một số tập lệnh khởi động phiên không tương tác (ví dụ: đối với phiên X11), vì vậy bạn cần cẩn thận: chỉ gọi exec(thay thế quy trình hiện tại) khi hiện tại Shell là tương tác. Ngoại trừ vỏ Bourne ( /bin/shcủa Solaris 10 trở về trước), bạn có thể nói rằng một vỏ được tương tác bởi sự hiện diện itrong danh sách tùy chọn ( $-).

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    Nếu bạn muốn zsh đọc của bạn .zprofile, hãy vượt qua -ltùy chọn.

  • Nếu vỏ đăng nhập của bạn là bash, bạn có thể tiến hành như trên. Ngoài ra, bạn có thể đặt các lệnh này vào ~/.bash_profile. Hầu hết các tập lệnh khởi động phiên chỉ đọc ~/.profilevà không đọc ~/.bash_profile, nhưng tôi đã thấy một số tập lệnh chạy dưới bash và đọc .bash_profile, vì vậy ngay cả ở đó bạn cũng nên cẩn thận không gọi exectrong trình bao không tương tác.

  • Nếu shell đăng nhập của bạn là csh hoặc tcsh, hãy xem một ví dụ trong Thay đổi shell mặc định mà không có chsh hoặc quản trị viên riêng


1

Tôi tin rằng lệnh, chshlà cho mục đích này. Mặc dù, tôi không chắc rằng mọi bản phân phối Linux / Unix đều hỗ trợ điều đó. Kiểm tra trang người đàn ông của chsh.


Một số hệ thống cũng có nó như passwd -s.
Stéphane Chazelas

1

Nếu bạn không thể chạy chshvì bạn không có đặc quyền quản trị viên, hãy nói chuyện với ai đó .

Nhiều khả năng bạn không thể sử dụng chshdưới dạng không phải root vì hệ thống bạn đang sử dụng được định cấu hình để chshkhông hoạt động, chẳng hạn vì hệ thống sử dụng NIS hoặc LDAP thay vì chỉ /etc/passwdtệp. Hoặc có lẽ quản trị viên hệ thống của bạn chỉ muốn duy trì một số kiểm soát.

Quy trình thay đổi vỏ của bạn phụ thuộc vào chính sách của tổ chức. Có thể có một lệnh cục bộ làm những gì chshbình thường. Hoặc bạn có thể cần gửi một vé hỗ trợ yêu cầu thay đổi vỏ.

Hầu hết các câu trả lời khác đều tốt, nhưng nếu quản trị viên của bạn phản hồi hợp lý, bạn có thể không muốn làm phiền việc hack các tập lệnh khởi động của mình. Có lẽ tôi chỉ cần gọi zsh -lthủ công sau khi đăng nhập cho đến khi quản trị viên cập nhật tài khoản của tôi.

Một lưu ý khác: Đôi khi các shell khác nhau có thể sử dụng cùng một tệp khởi động. Ví dụ, shbashcả hai có thể thực hiện $HOME/.profile, và cshtcshcả hai có thể thực hiện $HOME/.login$HOME/.cshrc(mặc dù các file khởi động vỏ cụ thể thích .bashrc, .bash_profile.tcshrccó thể ghi đè lên những). Nếu hệ vỏ mặc định của bạn là /bin/cshvà bạn muốn sử dụng /bin/tcsh, việc cập nhật .loginlệnh gọi của bạn /bin/tcsh -lcó thể tạo ra một vòng lặp vô hạn. zshkhông xảy ra để thực thi bashcác tệp khởi động cụ thể, vì vậy đó không phải là vấn đề đối với bạn.

Hầu hết các vỏ thiết lập các biến mà xác định được bao bạn đang chạy ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Nếu bạn định viết mã khởi động để gọi shell yêu thích của mình, thì không nên để nó ở trong một ifcái để nó được thực thi chỉ khi bạn chưa chạy shell đó. Sử dụng mã từ câu trả lời của konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(Sự phức tạp thêm của việc kiểm tra "${ZSH_VERSION:-unset}"thay vì chỉ "$ZSH_VERSION"cho phép khả năng bạn đã thực hiện set -o unset, một tùy chọn khiến tham chiếu đến một biến không xác định là lỗi.)


1

Tôi có thể nghĩ về một vài kịch bản.

  1. zshkhông có trong /etc/shellsvà OP muốn sử dụng nó mà không cần phải gõ zshtại dấu nhắc lệnh. Phương pháp khả thi.

    a) sử dụng thủ thuật hồ sơ để thực hiện nó khi đăng nhập. Điều này cũng hiệu quả như thực sự thay đổi vỏ.

    b) xin admin để thêm zshvào /etc/shellsđể bạn có thể chshđể nó

    c) cầu xin quản trị viên thay đổi vỏ của bạn. Điều này không khôn ngoan, vì nó sẽ làm mất khả năng của ftpbạn. Bạn chỉ có thể sử dụng ftpnếu bạn có vỏ/etc/shells

  2. người dùng muốn thoát khỏi một vỏ bị hạn chế, rất có thể rbashhoặc rsh.

    Nếu .profilecó thể chỉnh sửa, PATHcó thể được mở rộng bằng cách chỉnh sửa nó. Khi đã /binvào đường dẫn, bạn có thể bắt đầu bashtừ bên trong rsh/rbash, truy cập vào chshlệnh để cho phép bạn thay đổi trình bao. Nhiều lệnh có shell thoát có thể được sử dụng để thoát khỏi shell bị hạn chế và lấy lại quyền truy cập chsh.

  3. chshthực sự không hoạt động vì một số lý do khác. giải pháp a từ khả năng 1 là một câu trả lời ở đây là tốt.

Kịch bản 2 là lý do duy nhất để thực sự thay đổi trình bao mặc định (nó quá hạn chế).


-3

Tôi không nghĩ rằng câu trả lời được cung cấp thực sự làm cho zshvỏ mặc định. Nó đơn giản thay đổi shell thành zsh ngay khi người dùng đăng nhập vào shell mặc định của anh ấy / cô ấy . Người dùng vẫn sẽ đăng nhập vào DEFAULT SHELLnhưng với điều này, shell sẽ thay đổi thànhzsh

Để thay đổi shell mặc định, sử dụng:

usermod -s /path/to/shell username 

Bạn nên root để làm điều đó.

Nếu không, cách giải quyết trên sẽ có ích.

Đã thêm từ nhận xét

chsh -s /path/to/zsh  # considered as standard as compared to usermod

và nó có thể được gọi bởi người dùng cho anh ấy / cô ấy.


4
Câu hỏi khá rõ ràng rằng sửa đổi cơ sở dữ liệu người dùng hệ thống (bit bạn cần root để làm trong câu trả lời này) không phải là một tùy chọn.
Caleb

3
chsh -s /path/to/zshlà tiêu chuẩn hơn và thường (nhưng không phải luôn luôn) không yêu cầu quyền truy cập root, không giống như usermodluôn luôn như vậy. Vì vậy, câu trả lời của bạn có nhiều vấn đề hơn những gì câu hỏi đã nêu là không hoạt động.
Gilles 'SO- ngừng trở nên xấu xa'
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.