Làm cách nào tôi có thể sử dụng bash làm vỏ đăng nhập khi sysadmin của tôi từ chối để tôi thay đổi


38

Sysadmin unix nơi tôi đang làm việc không muốn cho tôi quyền truy cập để thay đổi vỏ đăng nhập của tôi từ kshsang bash. Anh ta đã đưa ra nhiều lý do, điều thú vị nhất là vì họ viết tất cả các kịch bản của họ cho kshhọ sẽ không hoạt động nếu tôi cố gắng chạy chúng. Tôi không biết anh ta lấy những ý tưởng này ở đâu, nhưng vì tôi không thể thuyết phục anh ta, tôi có cách nào khác không?

( chshđược cài đặt trên các máy này, nhưng chúng tôi sử dụng các khóa công khai / riêng để đăng nhập và tôi không có bất kỳ mật khẩu nào, vì vậy khi chshnhắc tôi nhập mật khẩu, tôi không có gì để cung cấp.)

Câu trả lời:


69

Khi bạn đăng nhập, tập tin ~/.profileđược đọc bởi shell đăng nhập (ksh cho bạn). Bạn có thể hướng dẫn shell đăng nhập đó tự thay thế bằng bash. Bạn nên thực hiện một số biện pháp phòng ngừa:

  • Chỉ thay thế vỏ đăng nhập nếu nó tương tác. Điều này rất quan trọng: mặt khác, đăng nhập trong chế độ đồ họa có thể không hoạt động (điều này phụ thuộc vào hệ thống: một số nhưng không phải tất cả các hệ thống đọc ~/.profilekhi đăng nhập qua xdm hoặc tương tự) và các thành ngữ như ssh foo '. ~/.profile; mycommand'sẽ thất bại.
  • Kiểm tra xem bash có sẵn không, vì vậy bạn vẫn có thể đăng nhập nếu thực thi không có vì lý do nào đó.

Bạn có lựa chọn có nên chạy bash như một vỏ đăng nhập hay không. Sự khác biệt lớn duy nhất trong việc biến nó thành một vỏ đăng nhập là nó sẽ tải ~/.bash_profilehoặc ~/.profile. Vì vậy, nếu bạn chạy bash như shell đăng nhập, hãy thật cẩn thận để có ~/.bash_profilehoặc cẩn thận không thực hiện bash đệ quy từ đó ~/.profile. Không có lợi thế thực sự của việc ~/.profilethực hiện bằng bash hơn là ksh, vì vậy tôi khuyên bạn không nên làm điều đó.

Đồng thời đặt SHELLbiến môi trường thành bash, để các chương trình như trình giả lập thiết bị đầu cuối sẽ gọi shell đó.

Đây là mã để chuyển sang bash. Đặt nó vào cuối của ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
Câu trả lời tuyệt vời! stackexchange cần một nút Gửi bia : đây sẽ là lúc tôi sử dụng nó.
iconoclast

Cảm ơn đầu tiên và. .profilechỉ hoạt động cho vỏ đăng nhập (như OP cần). Tôi sử dụng Remote Desktop Connection của Windows 10 để đăng nhập máy trạm Linux, sau đó mở Terminal trong gnome. Tôi muốn zshtrong khi sysadmin của tôi cho tôi bash. Trong trường hợp này, tôi phải thêm đoạn trích vào .bashrcthay vì .profile.
Cuối tuần

12

Đây là một chút bùn, nhưng bạn có thể bashlà vỏ bạn đang sử dụng khi đăng nhập bằng cách tạo một .profiletệp trong thư mục nhà của bạn, có chứa

SHELL=`type -P bash`
exec bash -l

Điều này sẽ khiến kshphiên được thay thế bằng bashphiên. Bạn sẽ không phải nhập exit(hoặc ^D) hai lần, như bạn sẽ làm nếu bạn bắt đầu một bashphiên mới mỗi lần bạn đăng nhập. Và nhập

echo $SHELL

thậm chí sẽ trả lại đường dẫn đến bash.


3
tất nhiên bạn có thể thay đổi $ SHELL khá dễ dàng bằng cách thêm một dòng để làm như vậy trước khi thực thi.
derobert

2
Nếu bạn muốn shell mới cũng là shell đăng nhập thì có lẽ bạn nên exec bash -l.
jw013

1
Một bình luận cuối cùng: typeđược đề nghị hơn which.
jw013

1
Tôi không hiểu! Cũng không nên bashđọc .profilenhư vậy tạo ra một vòng lặp vô hạn? Tôi đồng ý rằng một cái gì đó dọc theo dòng exec bashlà những gì bạn muốn, nhưng bạn cần phải chắc chắn rằng bạn làm điều đó chỉ để ksh đăng nhập của bạn vì vậy một số if-báo cáo được yêu cầu!
Bananguin

1
@ user1129682 không nếu có ~/.bash_profilehoặc~/.bash_login
Ulrich Dangel

4

Câu trả lời của Giles nên có cờ -l được thêm vào khi thực hiện bash, để mọi tập lệnh hồ sơ đăng nhập sẽ có nguồn gốc trong trình bao bash mới. (Ví dụ: mọi thứ trong /etc/profile.d/ trên RHEL). Kịch bản nên là:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

Bạn có thể giải thích lý do tại sao bạn nói để thêm -ltùy chọn? Tôi đã sử dụng điều này trong nhiều tháng mà không có vấn đề gì.
cokedude

1

Câu trả lời csh/tcshlấy cảm hứng từ người được bình chọn hàng đầu bởi @Gilles là

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

0

Solaris:

usermod -s /bin/bash root

1
Không usermod yêu cầu quyền quản trị viên và câu hỏi là "... khi quản trị viên của tôi từ chối ..."?
Phúc cho Geek
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.