了解脚本在 SSH 上运行时的行为

了解脚本在 SSH 上运行时的行为

好吧,最近我遇到了一个奇怪的行为。我有一个小型 bash 脚本,它只是远程获取 mysql 转储,然后将数据存储在服务器本身上,稍后再将其同步到备份服务器。

#!/bin/sh
/usr/bin/ssh -p 82001 user@remotehost  "mysqldump -u db_user -pSomePass mydb" |  gzip -c >  /sql/mybackup.sql.gz

但我看到文件是在 /sql 下的本地服务器上创建的,而不是在远程服务器上创建的。

这是否意味着 mysqldump 正在远程服务器上工作,然后数据通过网络传输到本地机器,然后压缩并存储在此处所需的文件中..而不是在远程?

答案1

管道符号后的命令gzip -c > /sql/mybackup.sql.gz正在本地机器上运行。

你应该使用

/usr/bin/ssh -p 82001 user@remotehost  "mysqldump -u db_user -pSomePass mydb |  gzip -c >  /sql/mybackup.sql.gz"

例子:

% ssh user@host "echo remote" | echo local  
local
user@host's password:

% ssh user@host "echo remote | echo local"
user@host's password:

答案2

ssh这并不奇怪,您正在shell 中通过管道传输命令的输出;您应该在远程服务器的 shell 中通过管道传输它:

#!/bin/sh
/usr/bin/ssh -p 82001 user@remotehost  "mysqldump -u db_user -pSomePass mydb | gzip -c >  /sql/mybackup.sql.gz"

还要注意,你不是在使用bash,而是sh使用 。使用方法bash

#!/bin/bash
/usr/bin/ssh -p 82001 user@remotehost  "mysqldump -u db_user -pSomePass mydb | gzip -c >  /sql/mybackup.sql.gz"

相关内容