我正在尝试通过在 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
命令发送的,这使得很难看看是什么。