在scp

时间:2017-07-26 04:36:01

标签: linux bash shell scripting sh

我希望在我的bash中放置一个简单的.bashrc函数,它通过接受'source'参数和'destination'参数来包装scp命令,到目前为止我们都试过了

function send() {
eval "scp $1 user@annoyingly-long-server-name:$2"
}

function send() {
scp $1 user@annoyingly-long-server-name:$2
}

...但是当我打电话给上述任何一个时

send file.txt ~/

我收到错误scp: home-directory-on-remote-machine: Operation not supported。在回显每个参数之后,似乎代码在评估之前扩展到远程机器的主目录。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:3)

首先,您可以使用ssh-keys来防止输入密码。

在使用您的功能之前,请执行一次:

ssh-copy-id remoteHostName

对于ssh,使用密钥而不是密码被认为是更好的,对于scp来说也是如此。

其次,您不需要eval

function send() {
    scp "$1" user@annoyingly-long-server-name:"$2"
}

最后,您需要使用显式路径名称:

send foo /home/luke/foo

因为~是如何正确评估/home/luke/的。{/ p>

更新,侧面故事:

如果您编写函数send的动机真的是annoyingly-long-server-name,那么您应该了解/home/luke/.ssh/config。 在这个文件里面你可以创造奇迹:

Host a-nicer-alias
    Hostname stupid-host-name.verylongdoamin.com
    User luke

然后你可以做scp a-nicer-alias

答案 1 :(得分:1)

我找到了一种方法,使用this thread将函数内的扩展波形符转换回字符串~。该功能现在是

function send() {
dest="$2"
dest="${dest/#$HOME/\~}"
scp $1 user@annoyingly-long-server-name:$dest
}

在第二行中,如果字符串"$HOME"出现在第二个参数的开头,则它将替换为代字号~。如果源和目标具有相同的$HOME并且用户实际上确实明确提供了目标路径,那么转换为~不会造成任何伤害,但如果他们具有相同的$HOME,它解决了问题。

出于某种原因,我似乎必须在执行字符串替换之前将$2分配给变量。