我正在尝试编写一个shell脚本,在调用时,使用dbaccess命令行工具从表中提取数据。
echo "unload to data.csv delimiter '|' select * from tbl_extract;" | time dbaccess $database_name;
现在当我运行它时,它运行我自己的帐户。 Dbaccess似乎使用登录的Unix帐户登录数据库。但我希望这可以在不同的帐户下运行。如何让dbaccess接受用户名和密码以使用其他帐户?
答案 0 :(得分:1)
As @Johnathan Leffler correctly pointed out, if you use the CONNECT
clause in the SQL, you cannot avoid being prompted for the password. What you need to do is ensure that the dbaccess
process itself runs as a different user.
You can either use sudo
, e.g.:
echo "unload to data.csv delimiter '|' select * from tbl_extract;" |\
sudo -u __run_as_user__ time dbaccess $database_name;
NB You may need to configure the sudoers
file to permit execution and not prompt for password.
The better alternative would be to set setuid
on the script, so that the whole script runs as __run_as_user__
. This has the added bonus of ensuring any files (such as data.csv
) are also owned by that user, and you don't run into permissions problems.
答案 1 :(得分:0)
您需要使用显式CONNECT
语句,并需要提供密码:
{
echo "CONNECT TO $database USER 'whoever';"
echo "UNLOAD TO 'data.csv' DELIMITER '|' SELECT * FROM tbl_extract;"
} |
time dbaccess - -
注意引用的微妙平衡;用户名必须是字符串,并且您希望通过变量指定数据库,因此整个字符串必须使用双引号,并且在名称周围使用单引号比使用反斜杠双引号{{1}更简单两次(即使用户名在变量中也可以工作)。
这将提示您输入用户的密码。
备选方案包括使用\"
或sudo
更改用户身份。
我的SQLCMD程序(与Microsoft的同名johnny-come-lately程序无关)有多种方法可以使用用户名连接到数据库并编写密码脚本以便在那里不需要交互,从完全不安全(命令行参数;脚本中的字符串)到相对安全(文件中只能由用户读取的字符串)。它可以代替DB-Access使用 - 我使用它而不是DB-Access,但后来我写了它(主要是因为我对DB-Access或其前身命令提供的接口感到满意)。 p>