如何在 Solaris/SunOS 中仅为我的用户设置 shell,而无法访问/etc/passwd
或任何其他su
内容?
此后,它应该适用于交互ssh
(1) 和ssh
发送命令 (2)。
uname -a
说SunOS ... 5.10 Generic_148889-04 i86pc i386 i86pc
编辑回应评论和答案
没有chsh
。
我不能这样做/usr/bin/passwd -e
——许可被拒绝。
默认 shell 是 bash。我想要 zsh。
我已经尝试手动设置SHELL
环境变量,并在文件中手动启动 shell .profile
,但这对我不起作用第二种情况(2):ssh user@host command
将在 bash 中运行command
。
与登录时获得我喜欢的 shell 相比,这是次要的,因此解决方法当然值得一提,只是,我提出这个问题的目的是以正确的方式得到它。因为它只与一个用户相关,所以我认为在不涉及 SA 的情况下也是可行的,但现在我不太确定。 (但是,任何解决(1)和(2)问题的解决方法都是很酷的,这是肯定的。)
答案1
方法#1:与chsh
通常,您可以使用该命令chsh
来更改 shell,而无需访问/etc/passwd
.该文件通常列出您的默认 shell,例如:
saml:x:500:501:Sam M. (local):/home/saml:/bin/zsh
普通用户只能更改他/她自己帐户的登录shell,超级用户即root用户可以更改任何帐户的登录shell。您可以使用以下命令查看系统上可用的 shell:
$ chsh --list-shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/zsh
要更改您的 shell,您可以使用以下命令:
$ chsh -s /bin/zsh saml
Changing shell for saml.
Password:
Shell changed.
查看文件效果很明显/etc/passwd
:
$ grep saml /etc/passwd
saml:x:500:501:Sam M. (local):/home/saml:/bin/zsh
您不会立即看到更改。您必须注销/登录才能看到它:
[saml@grinchy]~% echo $SHELL
/bin/zsh
方法#2:/usr/bin/passwd -e
如果您无权访问该命令chsh
,显然您在 Solaris 上没有该命令,并且您没有 root 访问权限来更改它/etc/passwd
,您仍然可以使用此命令执行相同的操作:
$ /usr/bin/passwd -e
方法#3:手动设置方法
如果上述方法都不是一个选项,那么您基本上只剩下最后一个选项,即将以下选项之一添加到现有 shell 的登录文件中:
默认 shell:/bin/csh 或 /bin/tcsh
将以下行添加到
$HOME/.login
:setenv SHELL=/bin/bash exec $SHELL
默认外壳:/bin/bash
将以下内容添加到
$HOME/.bash_profile
:export SHELL=/bin/zsh exec $SHELL
上面需要考虑的一些其他事情,/bin/bash
例如,在设置之前,您可以通过执行检查来查看当前的 $SHELL 是否已经存在,从而使它们更加防弹。如果是,则不执行任何操作,否则继续执行exec $SHELL
.
参考
答案2
技巧SHELL=newshell; exec "$SHELL"
已经被涵盖了。
现在,如果您还希望通过 ssh 运行命令来使用新的 shell。如果当前的登录 shell 是bash
,您可以将其添加到您的~/.bashrc
:
if [ -n "$BASH_EXECUTION_STRING" ]; then
export SHELL=/bin/zsh
exec "$SHELL" -c "$BASH_EXECUTION_STRING"
fi
每当启动时都会something
使用新的 shell执行bash
bash -c something
和上面写着~/.bashrc
。
shell 开头bash -c something
一般不读~/.bashrc
。一个例外是当它们bash
被sshd
orrshd
或 on调用时bash -ic something
。
[ -n "$SSH_CONNECTION" ]
如果您只想支付案件费用,您可以添加一张支票ssh
。
答案3
您无法通过普通 Solaris 安装来做到这一点。一个简单的解决方法是修改您的配置文件以执行所需的 shell。
例如,假设/etc/passwd
您的 shell 是/bin/bash
但您更喜欢/bin/ksh
:
$ tail -2 ~/.bash_profile
export SHELL=/bin/ksh
exec $SHELL
请注意不要因拼写错误而将您拒之门外,也不要因虚假的执行或逻辑而进入无限循环。