进入新环境并以新用户别名运行命令

进入新环境并以新用户别名运行命令

我想运行一个su - <desired_user>命令,然后执行一个命令。我想在新的 shell 中成为该用户,但只获取一个特定文件。

以上desired_user是批量用户,由许多常规用户共享,因此如果放入、、等,则什么都.profile不会起作用.bashrc.bash_profile

例如,它将su和采购命令组合成一个我可以运行的别名。

(user1) $ whoami
user1
(user1) $ su - desiredUser
(desiredUser) $ 
(desiredUser) $ . custom_profile/my_custom_vars.ksh

是否有这样的别名,我可以从 user1 中使用来完成和su - <desired_user>采购?再说一次,我不能在 .profile / .bashrc / .bash_profile 中包含任何内容,因为这会影响也成为此批处理用户的其他用户。

谢谢你!

答案1

expect

使用以下expect脚本:

#!/usr/bin/expect 

log_user 0
spawn /bin/su - desiredUser
stty -echo
expect "*: "
send_user "Password: "
expect_user -re "(.*)\n"
send "$expect_out(1,string)\r"
stty echo
send ". custom_profile/my_custom_vars.ksh\r"
interact

stty -echo和之间的行stty echo负责密码处理。可以将密码包含在脚本本身中。请参阅这个答案

发送密码后,脚本会发送所需的命令,就像您输入命令一样。然后它让您进行交互。

这个解决方案既快捷又粗暴。特别是脚本不会等待提示,而是. custom_profile/my_custom_vars.ksh立即发送。它应该可以工作,但如果您需要以这种方式发送许多命令,它可能不是一种可靠的方法。将命令分组到一个文件中并只发送一个命令来获取文件似乎更好。


--rcfile

我假设su - desiredUser运行bash。Bash 支持--rcfile选项:

当启动非登录 shell 的交互式 shell 时,~/.bashrc如果该文件存在,Bash 将从 读取并执行命令。[…] 该选项将强制 Bash 从而不是--rcfile file读取并执行命令。file~/.bashrc

来源, 头脑

最直接的方式是在选项bash --rcfile …后提供,但此选项不能用于执行交互式程序(请参阅)。为了避免这种情况,请创建一个自定义“shell”,即包装器:-csuman 1 su

customshell(需要可执行):

#!/bin/sh
exec /bin/bash --rcfile /full/path/to/your/rc.file "$@"

然后su像这样调用:

su -s /full/path/to/customshell - desiredUser

注意这将来源/full/path/to/your/rc.file 反而~/.bashrc。要静止源,~/.bashrc您需要. ~/.bashrc作为的第一行rc.file

相关内容