2014-01-30 71 views
1

當我測試當前的應用程序時遇到問題,我經常需要調整應用程序使用的數據庫。在多次失去重要更改後,我編寫了一個程序,將我的數據庫備份到一個文件,然後將文件檢入SubVersion。我發現那個備份應用程序不夠好。如何向控制檯應用程序提供密碼?

數據庫是一個PostgreSQL數據庫,我的備份應用程序調用pg_dump來創建備份文件。 pg_dump在控制檯窗口中執行。當數據庫在我自己的機器上時,它運行良好。但是當我將數據庫移到我們的測試服務器時,pg_dump要求輸入密碼。雖然這不是什麼大問題,但我希望能夠自動提供密碼,因爲它在備份應用程序中可用。

我試着按照我在這裏找到的建議,但pg_dump仍然停止並要求輸入密碼。這裏是我認爲應該提供密碼的代碼:

Process backupProcess = new Process(); 
backupProcess.StartInfo.UseShellExecute = false; 
backupProcess.StartInfo.RedirectStandardInput = true; 
backupProcess.StartInfo.FileName = dumpPath + "pg_dump.exe"; 
backupProcess.StartInfo.Arguments = " --host " + host + 
            " --port " + port + 
            " --username " + userName + 
            " --format custom --blobs --verbose --file " + 
            "\"" + txtBackupFile.Text + "\" " + dbName; 
backupProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
backupProcess.Start(); 
StreamWriter standardInput = backupProcess.StandardInput; 
standardInput.WriteLine("mypassword"); 
backupProcess.WaitForExit();// Waits here for the process to exit. 

謝謝你的幫忙。

ROBR

+0

真的應該cconsider使用Path.Combine(dumpPath,「pg_dump.exe」),而不是「dumpPath +」pg_dump.exe「。 –

+0

謝謝,我沒有意識到這種方法的存在,這比我擔心是否有斜線要好得多。 –

回答

1

也許這是作弊一點點(在這個意義上,它並沒有真正幫助你回答的怎麼養活輸入pg_dump的問題),但你可以參考this answer這表明使用一個.pgpass文件。當然可以動態地寫入這個文件,而不是在它提示時嘗試與程序交互。

關於.pgpasshere的信息。

+0

非常感謝那個鏈接。建立一個.pgpass文件,或者我可以使用Python腳本來回答這個問題。我還沒有嘗試過任何一個,但是當我在這裏時,我會標記這個作爲一個accacent的答案。 –

+0

聽起來好像在.NET中命令行上的自動交互(就像你可能使用「expect」工具或類似的東西)在.NET中有點不可靠。順便說一句,如果你寫一個虛擬的「pg_dump.exe」這個.NET程序,上面的程序對我很有用。 –

2

我以

backupProcess.EnvironmentVariables["PGPASSWORD"] = "password"; 

這種方式解決了這個問題,我避免了密碼將被存儲在計算機上

相關問題