Web开发人员非常常见的任务是将单个文件从开发框上的子目录上传到远程服务器上的同一子目录。 不幸的是,这总是最终是一个恼人的手动过程,涉及在两个服务器上切换目录,浪费大量的时间。
所以,我自己写了一个shell脚本来自动化为我,使用scp进行安全文件复制。 (重要注意:ftp是可怕的不安全,改用WinSCP )
解决的主要问题是,我的WordPress安装在我的开发机器上有一个不同的基本目录,而不是我的服务器上的安装。 在我的开发机器上是/ var / www,在我的服务器上是更像是/ var / www / howtoip / docs /。 我决定在脚本的开头把它们变成变量,像这样:SSHSERVER=thegeek@hostname.com
RDIR = / var / www / howtoip / docs
LDIR =\ / var \ / www
请注意,脚本中的本地目录(LDIR)在路径中的每个/之前都有一个\。 这是因为我们将在脚本中后面将它传递给sed命令,所以我们必须逃避这些值。 我肯定有一些其他的方法,但我不知道它。
接下来,我设置了自动ssh登录。 为此,您需要先运行ssh keygen实用程序,如下所示:ssh-keygen -t rsa
然后你需要将〜/ .ssh / id_rsa.pub文件复制到远程服务器上的〜/ .ssh / authorized_keys文件。 如果在远程服务器上已经创建了〜/ .ssh目录(可能需要检查),那么您可以运行此命令来复制密钥:cat〜/ .ssh / id_rsa.pub | ssh user @ hostnamecat >> .ssh / authorized_keys
现在我们有自动ssh登录,这将启用使用没有密码的scp实用程序。 现在让我们来看看我们将在脚本中使用的scp命令:scp $ 1 $ SSHSERVER:$ RDIR`pwd | sed“s / $ {LDIR} //”`/`echo $ 1 | seds /.*\///`
$ 1是您要传递给脚本的参数,用于您尝试上传的文件名。 $ SSHSERVER和$ RDIR是我们将在脚本开头设置的变量,以设置user @ hostname和前面的远程路径。
以pwd | sed开头的第一个块使用当前目录路径,并剥离与远程服务器不匹配的路径的前一部分,但保留路径的其余部分。 例如,如果你在/ var / www / wp-content /中运行命令,sed块将根据我们的LDIR变量去掉/ var / www,但保留/ wp-content / part 。
第二个块只是确保从传递给脚本的文件名中去掉整个前面的路径,所以你只需要得到文件名。
例如,如果您将脚本命名为up.sh,并从文件中的本地/ var / www / wp-content / plugins /目录运行它:up.sh myplugin.php
这将被shell扩展如下:scp myplugin.php thegeek@hostname.com:/var/www/howtoip/docs/wp-content/plugins/myplugin.php
而不是尝试根据文章创建自己的脚本文件,我已经提供它供你下载。 这样就不会有任何问题,特殊字符不工作...是的,我使用脚本上传自己=)
只要把它放在你的路径的某个地方,并命名为任何你想要的。 我把我重命名为“up”,所以我可以只输入“up filename.txt”上传。 还要记住打开它并更改脚本开头的变量以匹配您的环境。
这个脚本应该工作在任何具有* nix shell和scp实用程序。 我使用Ubuntu,但它应该在Solaris,OS X,甚至Windows安装Cygwin工作。