2013-05-16 31 views
2

我目前正在清理CentOS 6服務器上其他人留下的混亂。有一個應用程序需要每6小時備份到一個github帳戶。有一個腳本負責準備數據,它負責管理git add和git commit。git push不能在cron作業內工作

git push由「expect」腳本處理。這樣做是爲了在ssh請求時將密碼傳遞給git push。用戶不想使用空密碼。

腳本在root用戶的bash shell命令行中運行時運行良好。我可以看到文件傳輸到github。

當腳本在由root創建的crontab下運行時,腳本似乎運行,但git push不會發生。如果我手動運行git push,腳本失敗後,我注意到應該發生的推送發生在我從命令行調用的手動推送。看起來應該在腳本中發生的推送已被緩存,而不是推送給github。

任何人都可以建議我在這裏失蹤?是否有可能在這樣的腳本中使用git push?

問候

理查德

+0

當你手動執行命令時,你是否以root身份運行它?不是sudo? – Lynch

+1

命令在cron下失敗的常見原因是它取決於在.profile中設置的環境變量,因爲它不是由cron作業運行的。 – Barmar

+0

當我手動運行命令時,我以根用戶身份運行它 –

回答

1

的問題應該是在不被正確地SSH代理通過當混帳推嘗試運行ssh登錄密碼。

follow-up blog post所示,您不能簡單地在您的cron中調用ssh-agent -s,或者它只會創建另一個實例,而沒有任何密鑰。

爲了解決這個問題,我需要找到一種方法來開始另一個ssh-agent過程中保持,而是獲得對一個海馬開始我每次登錄的時間。
我做了一個改變我的crontab那會搜索現有的ssh-agent進程ID和認證套接字並將它們導入到cron環境中。這是一種黑客攻擊,但它確實有效(不像上次)。
只需添加以下到腳本試圖連接到你的SSH服務器之前(或做我做什麼,並把它們直接進入cron作業,用分號隔開):

export SSH_AGENT_PID=`ps -a | grep ssh-agent | grep -o -e [0-9][0-9][0-9][0-9]` 
export SSH_AUTH_SOCK=`find /tmp/ -path '*keyring-*' -name '*ssh*' -print 2>/dev/null` 

澄清:

就以下內容添加到您的腳本

這意味着上述兩行是聲明爲cron作業腳本的一部分,由被稱爲SA id cron工作。

把它們直接進入cron作業,用分號隔開

如果劇本足夠小,可以完全刪除腳本,使您的cron作業命令序列:見「 Run two commands with a crontab「。

crontab -l | { cmd1; cmd2 ; cmd3; } | crontab - 

該語法只是您可以使用的方法之一add programmatically a command to a cron job

+0

不能通過配置''opencf -c 8/bin/sh -c'umask 077''的'rc'腳本來改善它。 ssh-agent -s> /root/agent.env&&source/root/agent.env && ssh-add/path/to/the/key''在啓動時,cron作業腳本將只是'source/root/agent.env'在嘗試連接服務器之前? – kostix

+0

@kostix聽起來很不錯。你測試過了嗎? – VonC

+0

不,我自己會使用一個受到良好保護的*解密*鍵。但是,如果OP想要/需要輸入密碼,那麼專門的啓動設置對我來說似乎是件好事。順便說一句,我的評論並不是要求改善你的答案,而是試圖給OP提供一些新的想法。 – kostix