Solaris系统:能否通过Run Control启动时切换Shell及绑定自动执行脚本?
嘿,我来帮你搞定这两个Solaris上的Run Control问题,都是实际运维中常见的场景:
一、通过Run Control设置启动时切换Shell
首先得明确你的需求:如果是想让用户登录后默认使用指定Shell,其实不用绕rc脚本,直接修改用户的登录配置更简单——用usermod -s /path/to/target-shell username命令,比如usermod -s /bin/bash root,这样用户下次登录就会自动切换到目标Shell。
但如果是要在系统启动过程中,让rc脚本或后续服务使用特定Shell,或者全局修改所有交互式登录的默认Shell,可以这么做:
- 全局修改交互式登录Shell:编辑
/etc/default/login文件,找到SHELL字段,改成你想要的Shell路径,比如SHELL=/bin/bash。这个设置会覆盖用户passwd中的Shell配置,影响所有通过login程序发起的会话(包括控制台、SSH登录)。 - 用rc脚本强制切换Shell环境:在对应运行级的rc目录(比如rc3.d对应多用户模式)下创建脚本,比如
S99switch-shell,内容示例:
#!/bin/sh # 设置全局环境变量,让后续启动的服务继承这个Shell配置 export SHELL=/bin/bash # 如果要执行需要目标Shell特性的命令,直接指定Shell调用 /bin/bash -c "source /path/to/custom-env.sh && echo 'Shell switched' >> /var/log/rc-switch.log"
记得给脚本加执行权限:chmod 755 /etc/rc3.d/S99switch-shell。
二、在/etc/rc3.d/绑定脚本执行预设命令(解决你之前的失败问题)
你之前尝试passwd -e ; /sbin/sh没成功,核心原因是Solaris的rc脚本是在非交互式环境下运行的,没有终端输入支持,交互式命令(比如直接启动/sbin/sh)会因为没有输入源立刻退出,而passwd -e如果没指定用户名的话也会报错。
下面是正确的实现步骤:
- 创建rc脚本:在
/etc/rc3.d/下新建一个以S开头的脚本(S后面的数字决定执行顺序,数字越大越晚执行,比如S99custom-cmd),然后设置权限:chmod 755 /etc/rc3.d/S99custom-cmd。 - 编写非交互式命令逻辑:
- 对于
passwd -e:这个命令是强制用户下次登录修改密码,正确用法是指定用户名,比如passwd -e lunartist,这个命令不需要交互,直接就能执行。 - 如果要执行其他需要交互的命令,可以用
expect工具模拟交互(需要先安装expect包),或者用管道传递输入。比如某个命令需要输入"yes",可以写成echo "yes" | /path/to/command。 - 你之前的
/sbin/sh如果是要执行特定命令,应该用非交互式调用:/sbin/sh -c "your-command-here",而不是直接启动交互式Shell。
- 对于
- 示例脚本内容:
#!/bin/sh # 强制过期指定用户的密码 /usr/bin/passwd -e lunartist # 执行预设命令并记录日志 /sbin/sh -c "echo 'Custom command executed at rc3 start' >> /var/log/custom-rc.log"
- 测试验证:先手动执行脚本
/etc/rc3.d/S99custom-cmd,检查有没有报错,确认命令正常运行后再重启系统验证效果。
关键注意事项:
- rc脚本必须以
#!/bin/sh开头,Solaris的rc系统默认用Bourne Shell执行。 - 所有命令尽量用绝对路径(比如
/usr/bin/passwd而非passwd),避免环境变量缺失导致命令找不到。 - 绝对不要在rc脚本中直接运行交互式程序,除非用工具模拟交互,否则会卡住系统启动流程。
内容的提问来源于stack exchange,提问作者Lunartist
相关产品推荐
相关产品推荐

