我想使用 shell 脚本定期将数据库转储到我的远程托管站点上。不幸的是,服务器被锁定得很紧,没有mysqldump安装,二进制文件不能被普通用户/在主目录中执行(所以我不能自己“安装”它)并且数据库位于一个单独的服务器上,所以我不能直接抓取文件。
我唯一能做的就是通过 SSH 登录到网络服务器并使用mysql命令行客户端建立到数据库服务器的连接。如何将内容转储到mysqldumpSQL 格式的文件中?
奖励:如果可能,我如何将内容直接转储到 SSH 连接的一端?
我喜欢下面提出的 SSH 隧道的想法,但是,我需要双隧道它。
localhost -> remote web server -> remote database server
Run Code Online (Sandbox Code Playgroud)
这工作正常:
$ ssh -f -L 3306:mysql.example.com:3306 user@ssh.example.com -N
Run Code Online (Sandbox Code Playgroud)
但是,尝试登录mysql失败:
$ mysqldump -P 3306 -h localhost -u user -p db
Enter password:
mysqldump: Got error: 1045: Access denied for user 'user'@'localhost'
(using password: YES) when trying to connect
Run Code Online (Sandbox Code Playgroud)
我猜它希望用户凭据是'user'@'mysql.example.com'. 我怎样才能哄它使用它而不是“真正的”主机?
好的,我通过添加127.0.0.1 mysql.example.com到我的主机文件并通过mysqldump -P 3306 -h mysql.example.com -u user …
我对这个重写规则有一个奇怪的场景:
RewriteCond img/$2/$3/$4/$1 -f
RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ img/$2/$3/$4/$1 [L]
Run Code Online (Sandbox Code Playgroud)
目录结构为(简化):
var/
images/
..
www/
.htaccess
img -> /var/images
Run Code Online (Sandbox Code Playgroud)
换句话说,图像存储在 webroot 之外的通用数据存储区域中,并img通过符号链接链接到 webroot 的目录中。图像名称是散列。为提高效率,它们存储在三级深层目录层次结构中。例如:
0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg
Run Code Online (Sandbox Code Playgroud)
存储在
images/0a80/8e34/edaa/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg
Run Code Online (Sandbox Code Playgroud)
重写规则只是将文件名重写到嵌套目录结构中。
现在,奇怪的是它RewriteCond在我的本地系统上运行良好,但在测试服务器上却失败了。Apache 调试日志明确指出-f此条件的“模式不匹配”。如果我只是删除此条件,则重写规则可以正常工作并提供图像。
什么可能导致-f明显存在的文件失败?
FollowSymLinks被允许。通过 apt 安装的 Apache 版本 2.2.22-6ubuntu2 几乎没有修改。适用于 Apache 2.2.23 的本地安装(通过自制软件)。看不到应该导致这种情况的两个版本之间的任何重大变化。
关于实际目录结构的一些可能更重要的细节:
$ ls -l /var/www/myapp/current
[snip] /var/www/myapp/current -> /var/www/myapp/releases/20130418090750
$ ls -la /var/www/myapp/current/webroot
[snip]
[snip] .htaccess
[snip] img -> /usr/local/var/myapp/images
Run Code Online (Sandbox Code Playgroud)
Apache webroot 配置为:
DocumentRoot /var/www/myapp/current/webroot
Run Code Online (Sandbox Code Playgroud)
如果我写RewriteCond为:
RewriteCond /usr/local/var/myapp/images/$2/$3/$4/$1 …Run Code Online (Sandbox Code Playgroud) 有人可以澄清应该如何使用launchdProgram和ProgramArguments配置参数吗?我试图在命令行上注册一个服务,我会像这样开始:
$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)
我已经尝试以各种方式将其分配给 launchd:
$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)
或者
<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/service</string>
<string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
或者
<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/service start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
或者
<key>ProgramArguments</key>
<array>
<string>/foo/bar/baz/python</string>
<string>/foo/bar/baz/service</string>
<string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)
以及几乎任何其他似乎有意义的变体。但是,该服务总是因各种不同的错误而失败。唯一有效的方法是使用确切的行创建一个 .sh 脚本并通过 launchd运行它。
因此,要一劳永逸地了解launchd服务:launchd如何使用这两个配置参数,我将如何使用它们复制我的bash命令以及两者之间有什么区别?
或者我可能只是偶然发现了运行这个特定服务的问题,无论是否存在通过 bash 执行它时存在的一些环境变量?服务本身没有提供任何有用的输出。
我已经按照 中的建议查阅了execvp(3)手册条目launchd.plist(5),但这并没有真正加深我的理解。