我希望在我的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
。在回显每个参数之后,似乎代码在评估之前扩展到远程机器的主目录。我该如何防止这种情况?
答案 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
分配给变量。