2015-12-09 99 views
1

我試圖編寫一個shell腳本,在調用時使用dbaccess命令行工具從表中提取數據。使用dbaccess以不同的用戶身份登錄到Informix

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

現在,當我運行這個,它運行我自己的帳戶。 Dbaccess似乎使用登錄的Unix帳戶登錄到數據庫。但我希望這可以在不同的帳戶下運行。如何讓dbaccess接受用戶名和密碼來使用其他帳戶?

回答

0

您需要使用顯式CONNECT聲明,並需要提供密碼:

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

注意引號的微妙的平衡;用戶名必須在字符串中,並且您希望通過變量指定數據庫,因此整個字符串必須使用雙引號,並且使用單引號可以比使用單引號更簡單,而不是反斜槓雙引號\"兩次(其中即使用戶名在變量中也可以工作)。

這會提示您輸入用戶的密碼。

替代方案包括使用sudosu更改用戶身份。

我的SQLCMD程序(與微軟的同名johnny-come-lately程序​​無關)有多種方式通過用戶名連接到數據庫並編寫密碼腳本,以便不需要交互,範圍從完全不安全(命令行參數;腳本中的字符串)到相對安全(文件中只能由用戶讀取的字符串)的字符串。它可以用來代替數據庫訪問 - 我用它來代替數據庫訪問,但後來我寫了它(主要是因爲我對DB-Access或其前任命令提供的界面不滿意)。

+0

由於我試圖創建一個自動化的工作,有沒有其他的爲什麼要避免得到提示輸入密碼? – nJoshi

+0

否;無法使用DB-Access來避免提示。 SQLCMD確實提供了這樣一種機制。它要求你有ESQL/C(ClientSDK的一部分,通常不是問題)和一個C編譯器,但是(應該是)以其他方式直接安裝。它有一個Unix自動配置腳本來完成繁重的工作。如果您使用的是Windows環境,那麼情況就會變得更加嚴峻 - 我最近沒有將SQLCMD移植到Windows上(十多年前,現在我已經做到了這一點)。你可以試試['expect'](http://expect.sourceforge.net/);它將能夠以編程方式驅動DB-Access。 –

1

正如@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)也由該用戶擁有,並且您不會遇到權限問題。

+0

我一直在嘗試使用su,以不同的用戶身份運行,再次出現密碼彈出問題。但是你用setuid提出的建議是有希望的。我會研究這個。謝謝。 – nJoshi

+0

你不會得到與蘇。 su和sudo之間的關鍵區別在於後者可以配置爲在沒有密碼的情況下執行。 – RET

相關問題