我正在嘗試透過在 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.bashrc
ssh
/bin/cat > user2@server2:/......./test.sql.gz
確保 中的內容~/.bashrc
不會執行類似stty
or 的操作mesg
(mesg
來自sysvinit-utils
正如許多 Linux 發行版中所發現的那樣,它會輸出與運行 ) 所看到的完全相同的訊息: | mesg n
,或者僅在檢查 stdin 是終端[ -t 0 ]
並且 shell 是交互式的之後才執行此操作 ( case $- in (*i*) ...;; esac
)。
如果遠端使用者的登入 shell 是csh
or tcsh
,請查看每個 shell 解釋的.cshrc
and.tcshrc
和 for zsh
,~/.zshenv
包括非互動式 shell,無論它們是否被呼叫ssh
(但因此,它們通常不會執行任何操作)無條件tty
地)。
請注意,這不會導致您的命令失敗,只會顯示虛假訊息。
導致命令失敗的原因是:
/bin/cat > user2@server2:/......./test.sql.gz
When 沒有太大意義,除非onuser2@server2:
的主目錄中有一個被呼叫的目錄。user2
server2
這可能就是導致錯誤的原因:
: 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 ...
命令行時通過cat
該mysqldump
命令發送的,這使得很難看看是什麼。