【问题标题】:bash variable expansion for scp tab completion用于 scp 选项卡完成的 bash 变量扩展
【发布时间】:2015-03-19 05:50:40
【问题描述】:

我在工作中使用 ssh,最近在我的本地工作机器上切换到 Linux。结果,我现在必须完全限定主机名(即,我需要使用 dev1.megacorpnetworkdomain.com 而不是 dev1)。这对 scp 来说相当烦人。我已经为远程路径设置了自动完成功能。我试图做的是为路径创建一个变量别名:

WORK='user@dev1.megacorpnetworkdomain.com:/home/user'

现在的问题是当我执行以下操作时 scp 无法执行远程完成:

scp $WORK/<tab>

而以下正确执行远程完成:

scp user@dev1.megacorpnetworkdomain.com:/home/user/<tab>

我试图通过使用complete 天真地解决这个问题:

_scp_expand_vars () {
    COMPREPLY=()
    local cur=${COMP_WORDS[COMP_CWORD]}
    eval cur=$cur
    COMPREPLY=( $cur )
    return 0
}
complete -F _scp_expand_vars scp

这现在可以正确扩展 scp 的变量,但会破坏远程目录扩展的原始功能。我怎样才能实现两者?根据一些在线研究,我假设原始功能由 _scp_remote_files 函数处理?

【问题讨论】:

  • 您可以根据需要在.ssh/config 文件中为scp 设置主机别名。默认情况下,scp 是否不包含您在 known_hosts 文件中的完整主机?
  • 确实如此,但是,感兴趣的主机似乎不在 ~/.ssh/known_hosts 中,并且永远不会触发将 ssh 添加到那里的提示。我只是手动添加它并开始自动完成,我想这让我 90% 在那里。此外,由于某种原因,在 .ssh/config 中创建别名会导致远程完成显着变慢。

标签: bash variables bash-completion


【解决方案1】:

第一,如果你经常访问megacorpnetworkdomain.com下的主机,你应该把它放在/etc/resolv.conf;应该有一行:

search megacorpnetworkdomain.com

然后您可以通过引用短主机名来使用所有主机,即任何程序中的 dev1。

对于 ssh,您可以遵循 Etan Reiser 的建议,示例如下:

Host dev1
    HostName dev1.megacorpnetworkdomain.com
    User user

当您使用 ssh 或 scp 时,它们会像往常一样为您提供在那里定义的选项,并使用制表符完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多