shell 使用dbaccess以其他用户身份登录Informix

9udxz4iz  于 2023-01-21  发布在  Shell
关注(0)|答案(2)|浏览(194)

我正在尝试编写一个shell脚本,当调用该脚本时,它使用dbaccess命令行工具从表中提取数据。

echo "unload to data.csv delimiter '|' select * from tbl_extract;" | time dbaccess $database_name;

现在,当我运行这个程序时,它是用我自己的帐户运行的。Dbaccess似乎使用已登录的Unix帐户来登录数据库。但是我希望它在不同的帐户下运行。我如何让dbaccess接受用户名和密码来使用不同的帐户?

oxcyiej7

oxcyiej71#

正如@Johnathan Leffler正确指出的那样,如果在SQL中使用CONNECT子句,您将无法避免被提示输入密码,您需要做的是确保dbaccess进程 * 本身 * 以不同的用户身份运行。
您可以使用sudo,例如:

echo "unload to data.csv delimiter '|' select * from tbl_extract;" |\
    sudo -u __run_as_user__ time dbaccess $database_name;

NB您可能需要配置sudoers文件以允许执行并且不提示输入密码。
更好的替代方案是set setuid on the script,这样整个脚本就可以作为__run_as_user__运行,这样做的额外好处是可以确保任何文件(如data.csv)也属于该用户,并且不会遇到权限问题。

kt06eoxx

kt06eoxx2#

您需要使用显式CONNECT语句,并需要提供密码:

{
echo "CONNECT TO $database USER 'whoever';"
echo "UNLOAD TO 'data.csv' DELIMITER '|' SELECT * FROM tbl_extract;"
} |
time dbaccess - -

注意引号的微妙平衡;用户名必须在字符串中,并且您希望通过变量指定数据库,因此字符串作为一个整体必须用双引号括起来,并且在名称两边使用单引号比两次反斜杠双引号\"更简单(即使用户名在变量中也可以)。
这将提示您输入用户密码。
替代方法包括使用sudosu更改用户的身份。
我的SQLCMD程序(与Microsoft的同名johnny-come-late程序无关)有多种方法可以使用用户名连接到数据库,并编写密码脚本,这样就不需要交互,范围从完全不安全的(命令行参数;脚本中的字符串)到相对安全的(文件中的字符串,只能由用户读取)。它可以用来代替DB-Access -我用它代替DB-Access,但后来我写了它(主要是因为我对DB-Access或其前身命令提供的接口不满意)。

相关问题