当我的系统管理员拒绝让我更改它时,如何使用bash作为我的登录shell


38

Unix的系统管理员那里我的工作是不愿意给我访问我的登录shell从改变kshbash。他提供了各种借口,最有趣的是,因为他们编写了所有脚本,ksh因为如果我尝试运行它们,它们将无法工作。我不知道他从哪里得到这些想法,但是由于我无法说服他,我还有其他选择吗?

chsh已安装在这些计算机上,但是我们使用公共/专用密钥对进行登录,并且我没有任何密码,因此当chsh提示我输入密码时,我什么也没有提供。)

Answers:


69

登录时,~/.profile登录外壳程序(适合您的ksh)读取该文件。您可以指示该登录Shell替换为bash。您应该采取一些预防措施:

  • 仅在交互式登录外壳时才更换。这很重要:否则,以图形方式登录可能无法工作(这是系统相关的:~/.profile通过xdm或类似方式登录时,某些(但不是全部)系统会读取),并且诸如此类的习惯用法ssh foo '. ~/.profile; mycommand'会失败。
  • 检查bash是否可用,以便在可执行文件由于某种原因不存在时仍可以登录。

您可以选择是否将bash作为登录shell运行。使它成为登录shell的唯一主要区别是它将加载~/.bash_profile~/.profile。因此,如果您将bash作为登录shell运行,请非常小心地使用a ~/.bash_profile或注意不要从中递归执行bash ~/.profile~/.profile由bash而不是ksh执行并没有真正的优势,所以我建议不要这样做。

SHELL还将环境变量设置为bash,以便终端仿真器之类的程序将调用该shell。

这是切换到bash的代码。将其放在的末尾~/.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
很好的答案!stackexchange需要一个“ 发送啤酒”按钮:这是我要使用的时间。
iconoclast 2012年

首先谢谢。.profile仅适用于登录shell(根据OP的需要)。我使用Windows 10的远程桌面连接登录Linux工作站,然后在gnome中打开Terminal。我想zsh在系统管理员给我的同时给我bash。在这种情况下,我必须添加.bashrc而不是的代码段.profile
周末

12

这有点麻烦,但是您可以bash通过.profile在主目录中创建一个文件来使它成为登录时使用的shell ,其中包含

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

这将导致ksh会话替换为bash会话。您无需两次输入exit(或^D),就像bash每次登录时手动启动一个新会话一样。

echo $SHELL

甚至会返回的路径bash


3
您当然可以通过在执行程序之前添加一行来轻松更改$ SHELL。
derobert

2
如果您希望新的外壳程序也成为登录外壳程序,则可能应该这样做exec bash -l
2012年

1
最后一个意见:type推荐which
2012年

1
我不明白!bash也不会阅读.profile从而产生无限循环吗?我同意exec bash您想要的是什么,但是您需要确保仅对登录ksh进行操作,因此需要一些if语句!
Bananguin 2012年

1
@ user1129682没有,如果有~/.bash_profile~/.bash_login
乌尔里希Dangel

4

Giles的答案在执行bash时应添加-l标志,以便所有登录配置文件脚本都将来自新的bash shell。(例如,RHEL上/etc/profile.d/中的任何内容)。该脚本应为:

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

您能解释为什么说要添加-l选项吗?我已经使用了几个月,没有任何问题。
cokedude

1

csh/tcsh由@Gilles投票选出的最高奖项所激发的答案是

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
usermod是否不需要管理员权限,问题是“ ...当我的管理员拒绝...时”?
祝福极客
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.