我想在我的.bashrc
中放置一个简单的bash
函数,通过接受'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
。 在回显每个参数之后,似乎在评估之前, 代字号被扩展到了远程机器的主目录中 。 我怎样才能防止这个?
首先,你可以使用ssh-key来防止输入密码。
在你使用你的函数之前只做一次:
ssh-copy-id remoteHostName
对于ssh使用密钥而不是密码被认为是更好的,对于scp来说也是如此。
其次,你不需要eval
。
function send() { scp "$1" user@annoyingly-long-server-name:"$2" }
最后,你需要使用明确的路径名称:
send foo /home/luke/foo
因为~
是一些如何不正确的评估/home/luke/
。
如果你写函数send
的动机真的很annoyingly-long-server-name
那么你应该知道/home/luke/.ssh/config
。 在这个文件里面你可以创造奇迹:
Host a-nicer-alias Hostname stupid-host-name.verylongdoamin.com User luke
那么你可以简单地做ssh a-nicer-alias
我想出了一个方法来从扩展的代字符转换回使用这个线程函数内的字符串~
。 现在的功能
function send() { dest="$2" dest="${dest/#$HOME/\~}" scp $1 user@annoyingly-long-server-name:$dest }
在第二行中,如果字符串"$HOME"
出现在第二个参数的开始处,则用波浪号代替。 如果源和目标具有相同的$HOME
,并且用户实际上明确提供了目标路径,则转换为~
时不会造成任何伤害,但如果它们没有相同的$HOME
,则会修复问题。
出于某种原因,在执行字符串替换之前,似乎必须将$2
分配给一个变量。