stdin : 不在 tty 中

stdin : 不在 tty 中

我正在嘗試透過在 ssh 中使用以下命令從 server1 到 server2 進行備份

[user1@server1 ~]$ mysqldump -u dbuser -p"dbpwd" --opt  dbname        \
                      | gzip -c                                       \
                      | ssh  -o StrictHostKeyChecking=no              \
                             -o UserKnownHostsFile=/...../known_hosts \
                             -l deploy                                \
                             -i  /...../id_rsa                        \
                             -v  user2@server2                        \
                             "/bin/cat > /.../test.sql.gz" \
                      2>&1 

我收到以下錯誤

debug1: Sending command: /bin/cat > -t user2@server2:/..../test.sql.gz
stdin: is not a tty
/bin/cat: user20@server2:/..../test.sql.gz
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
: No such file or directory
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 265040, received 2552 bytes, in 0.0 seconds
Bytes per second: sent 6736670.0, received 64865.6
debug1: Exit status 1
mysqldump: Got errno 32 on write

任何人都可以解決這個問題嗎?

更新

我從備份命令中刪除了“user2@server2”和“deploy -i”並運行它。它給了我以下訊息

debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: /bin/cat > -t /....../test.sql.gz
stdin: is not a tty
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
/bin/cat: /......./test.sql.gz: No such file or directory
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 248608, received 2536 bytes, in 0.1 seconds
Bytes per second: sent 4628197.5, received 47211.3
debug1: Exit status 1
mysqldump: Got errno 32 on write

答案1

user2如果遠端使用者 ( on server2)的登入 shell是bash,請注意在呼叫時bash讀取和解釋~/.bashrc(可能或遠端系統上的等效內容) ,即使不是互動式的(例如當它只是解釋您提供的內容時) 。/etc/bash.bashrcssh/bin/cat > user2@server2:/......./test.sql.gz

確保 中的內容~/.bashrc不會執行類似sttyor 的操作mesgmesg來自sysvinit-utils正如許多 Linux 發行版中所發現的那樣,它會輸出與運行 ) 所看到的完全相同的訊息: | mesg n,或者僅在檢查 stdin 是終端[ -t 0 ]並且 shell 是交互式的之後才執行此操作 ( case $- in (*i*) ...;; esac)。

如果遠端使用者的登入 shell 是cshor tcsh,請查看每個 shell 解釋的.cshrcand.tcshrc和 for zsh~/.zshenv包括非互動式 shell,無論它們是否被呼叫ssh(但因此,它們通常不會執行任何操作)無條件tty地)。

請注意,這不會導致您的命令失敗,只會顯示虛假訊息。

導致命令失敗的原因是:

 /bin/cat > user2@server2:/......./test.sql.gz

When 沒有太大意義,除非onuser2@server2:的主目錄中有一個被呼叫的目錄。user2server2

這可能就是導致錯誤的原因:

 : No such file or directory

事實上,它所抱怨的“檔案或目錄”似乎是“空的”,這表明命令行中的某處隱藏著一個回車符。

你想要的是/bin/cat > /path/to/output/file/on/server2/test.sql.gz,並且該/path/to/output/file/on/server2目錄必須事先存在。

您可能還想暫時刪除-v~/.bashrc,因為目前我們正在看到來自ssh、 在您的 中運行的命令的消息~/.bashrc,可能是由遠端 shell 在解釋該cat ...命令行時通過catmysqldump命令發送的,這使得很難看看是什麼。

相關內容