Web开发人员的一项非常常见的任务是将单个文件从开发盒上的子目录上载到远程服务器上的同一子目录。不幸的是,这总是一个令人烦恼的手动过程,涉及在两台服务器上切换目录,浪费了大量的时间。

所以,我自己编写了一个shell脚本来为我自动执行此操作,使用scp进行安全文件复制。 (重要的注意事项:ftp非常不安全,请改用WinSCP)

要解决的主要问题是我的开发机器上的WordPress安装与我服务器上的安装有不同的基本目录。在我的开发机器上它是/ var / www,在我的服务器上更像是/ var / www / howtogeek / docs /。我决定在脚本开头将它们移动到变量中,如下所示:

[email protected] RDIR=/var/www/howtogeek/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 [email protected] ‘cat >> .ssh/authorized_keys’

现在我们已经有了自动ssh登录,这将使用scp实用程序而无需密码。现在让我们看看我们将在脚本中使用的scp命令:

scp $1 $SSHSERVER:$RDIR`pwd|sed “s/${LDIR}//”`/`echo $1|sed ‘s/.*///’`

$ 1是您要传递给脚本的参数,用于您尝试上传的文件名。 $ SSHSERVER和$ RDIR是我们在脚本开头设置的变量,用于设置user @ hostname和前一个远程路径。

以pwd | sed开头的第一个块采用当前目录路径并剥离与远程服务器不匹配的路径的前一部分,但保留路径的其余部分。例如,如果你在/ var / www / wp-content /中运行命令时,sed块会根据我们的LDIR变量去掉/ var / www,但保留/ wp-content /部分。

第二个块只是确保从传递给脚本的文件名中删除整个前面的路径,这样你就可以得到文件名。

例如,如果您将脚本命名为up.sh并从文件中的本地/ var / www / wp-content / plugins /目录运行它:

up.sh myplugin.php

这将由shell扩展如下:

scp myplugin.php [email protected]:/var/www/howtogeek/docs/wp-content/plugins/myplugin.php

我没有尝试根据文章创建自己的脚本文件,而是提供了下载。这样,特殊字符不会出现任何问题......是的,我使用脚本上传自己=)

下载geek-uploader.sh

把它放在你路径的某个地方,然后根据你的意愿命名。我将我的名字重命名为“up”,所以我只需输入“up filename.txt”即可上传。还要记得打开它并更改脚本开头的变量以匹配您的环境。

此脚本应适用于具有* nix shell和scp实用程序的任何内容。我正在使用Ubuntu,但它应该适用于Solaris,OS X,甚至安装了Cygwin的Windows。

重要提示:
编辑点评: