linux - 在 scp 的简单函数包装器中使用代字号 ~ 的问题

标签 linux bash shell scripting sh

我想在我的 .bashrc 中放置一个简单的 bash 函数,它通过接受 'source' 参数和 ' destination' 参数,到目前为止都尝试过

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

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

...但是当我将以上任何一个称为 la

send file.txt ~/

我收到错误 scp: home-directory-on-remote-machine: Operation not supported。在回显每个参数之后,代字号似乎在评估之前扩展到远程机器的主目录。我怎样才能避免这种情况?

最佳答案

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

在你使用你的函数之前只做一次:

ssh-copy-id remoteHostName

对于 ssh 使用 key 而不是密码被认为更好,对于 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/配置。 在这个文件中你可以创造奇迹:

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

然后你可以简单地做 scp a-nicer-alias

关于linux - 在 scp 的简单函数包装器中使用代字号 ~ 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45317559/

相关文章:

linux - 查找旧文件并写入列表,然后删除旧文件的脚本

linux - 将 s3fs 作为卷提供给 docker

linux - 如何使 Linux bash 终端中的 ctrl+c 行为看起来像 OSX 终端

arrays - awk 命令结果放入数组

bash - 如何在 shell 脚本中停止一个进程并转到下一个进程?

bash - 在 bash shell 中对文件进行排序

python - 日志记录在 python 3.9.4 中似乎无法正常工作

java - 如何在 ubuntu 中以 super 用户身份运行 eclipse

linux - 如何用sed用字符/字符串替换空行

Bash - Curl (6) 无法解决主机问题