2012-10-15 33 views
4

我想在另一臺服務器上轉儲表備份,我使用ssh來做這件事。 當我運行下面的命令時,它會給出錯誤,但轉儲文件被複制到目標。爲什麼ssh用於在另一臺服務器上轉儲備份文件時出現`tcgetattr`錯誤?

mysqldump -u username -ppassword dbname tablename | ssh -t -t [email protected]_name 'cat > /tmp/bckp.sql'; 

tcgetattr:無效的參數

如果我按CTRL +ç然後它追加與Killed by signal 2.

錯誤消息這是爲什麼錯誤?

回答

9

我在使用ssh -t -tssh -tt強制僞終端分配時看到此錯誤。

tcgetattr函數用於查找由文件描述符表示的僞終端的屬性;它需要一個文件描述符和一個指向termios結構的指針來存儲終端元數據。它從stub code in glibc中看到我看到這個錯誤代表termios結構的空指針。我不確定這些相同的錯誤處理語義是否適用於tcgetattr的特定於平臺的實現。

如果要抑制這種錯誤,調用ssh像這樣:

ssh 2>/dev/null 

這將STDERR重定向到/dev/null;您在使用此重定向進行調用時不會看到錯誤。請注意,這將掩蓋其他錯誤ssh;您可能需要刪除此調試目的。

2

在我的情況下,在兩級ssh調用的外部ssh上強制分配pty可以解決問題。

詳情:

當您爲ssh來運行(如SSH some_server「do_some_command」)的命令,那麼SSH假定您將不再需要一個交互式會話,並作爲其提交它不會分配PTY你要求的「do_some_command」作業。如果你有兩層ssh(例如,假設你想先ssh進入一個「網關」機器,並從那裏ssh進入一個「內部」機器並運行一些「inner_command」),那麼事情會變得很有趣。 。

事情是,從外層ssh的角度來看,使用雙層ssh'ing作業,您要求外層ssh運行非交互式命令,因此外層ssh不會分配tty。

如果你在內部ssh中運行的命令是交互式的,它可能會想要查詢tty屬性,它會(正當地)抱怨它沒有在tty上運行。

在我的情況下,解決方案是通過使用-t參數強制外部ssh分配一個pty。因此,它是這樣的:

的ssh -t <gateway_machine> 「SSH <inner_machine> \」 <inner_interactive_command> \」「

問候系統管理員那裏

相關問題