我正在尝试编写一个shell脚本,当调用该脚本时,它使用dbaccess命令行工具从表中提取数据。
echo "unload to data.csv delimiter '|' select * from tbl_extract;" | time dbaccess $database_name;
现在,当我运行这个程序时,它是用我自己的帐户运行的。Dbaccess似乎使用已登录的Unix帐户来登录数据库。但是我希望它在不同的帐户下运行。我如何让dbaccess接受用户名和密码来使用不同的帐户?
oxcyiej71#
正如@Johnathan Leffler正确指出的那样,如果在SQL中使用CONNECT子句,您将无法避免被提示输入密码,您需要做的是确保dbaccess进程 * 本身 * 以不同的用户身份运行。您可以使用sudo,例如:
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)也属于该用户,并且不会遇到权限问题。
sudoers
setuid
__run_as_user__
data.csv
kt06eoxx2#
您需要使用显式CONNECT语句,并需要提供密码:
{ echo "CONNECT TO $database USER 'whoever';" echo "UNLOAD TO 'data.csv' DELIMITER '|' SELECT * FROM tbl_extract;" } | time dbaccess - -
注意引号的微妙平衡;用户名必须在字符串中,并且您希望通过变量指定数据库,因此字符串作为一个整体必须用双引号括起来,并且在名称两边使用单引号比两次反斜杠双引号\"更简单(即使用户名在变量中也可以)。这将提示您输入用户密码。替代方法包括使用sudo或su更改用户的身份。我的SQLCMD程序(与Microsoft的同名johnny-come-late程序无关)有多种方法可以使用用户名连接到数据库,并编写密码脚本,这样就不需要交互,范围从完全不安全的(命令行参数;脚本中的字符串)到相对安全的(文件中的字符串,只能由用户读取)。它可以用来代替DB-Access -我用它代替DB-Access,但后来我写了它(主要是因为我对DB-Access或其前身命令提供的接口不满意)。
\"
su
2条答案
按热度按时间oxcyiej71#
正如@Johnathan Leffler正确指出的那样,如果在SQL中使用
CONNECT
子句,您将无法避免被提示输入密码,您需要做的是确保dbaccess
进程 * 本身 * 以不同的用户身份运行。您可以使用
sudo
,例如:NB您可能需要配置
sudoers
文件以允许执行并且不提示输入密码。更好的替代方案是set
setuid
on the script,这样整个脚本就可以作为__run_as_user__
运行,这样做的额外好处是可以确保任何文件(如data.csv
)也属于该用户,并且不会遇到权限问题。kt06eoxx2#
您需要使用显式
CONNECT
语句,并需要提供密码:注意引号的微妙平衡;用户名必须在字符串中,并且您希望通过变量指定数据库,因此字符串作为一个整体必须用双引号括起来,并且在名称两边使用单引号比两次反斜杠双引号
\"
更简单(即使用户名在变量中也可以)。这将提示您输入用户密码。
替代方法包括使用
sudo
或su
更改用户的身份。我的SQLCMD程序(与Microsoft的同名johnny-come-late程序无关)有多种方法可以使用用户名连接到数据库,并编写密码脚本,这样就不需要交互,范围从完全不安全的(命令行参数;脚本中的字符串)到相对安全的(文件中的字符串,只能由用户读取)。它可以用来代替DB-Access -我用它代替DB-Access,但后来我写了它(主要是因为我对DB-Access或其前身命令提供的接口不满意)。