我想运行一个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”,即包装器:-c
su
man 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
。