如何通过 scp-and-ssh 指定两次主机?

如何通过 scp-and-ssh 指定两次主机?

我经常做这样的事:

scp somefile me@host:/some/path
ssh me@host

两次输入me@host可能很烦人。我们(或至少bash)可以使用 来获取最后一个参数!:$,但那(me@host:/some/path)并不是我们ssh想要的。

那么,我怎样才能将scp文件立即ssh发送到同一主机——而不必多次明确指定主机?

请注意,我对将主机保存在变量中不感兴趣,例如PLACE=me@host; scp somefile at $PLACE:/some/path; ssh $PLACE

答案1

sshscp到上一个命令中使用的主机

好吧,因为根据您的评论,me@host变量中的存储是1;我们必须采用另一种更聪明的方式来做:

$ scp somefile me@host:/some/path
$ ssh "${_%%:*}" 

这将使sshme@host

解释

$_调用上一个命令的最后一个参数。该%%构造删除最长匹配自后退字符串。:*匹配从冒号 ( :) 开始的所有内容。

因此"${_%%:*}"删除从:上一个命令开始的所有内容(即:/some/path)离开me@host

测试使用GNU bash, version 4.3.30(1)-release


1如果您问我,在和命令中执行hn=me@host然后使用比使用更容易。特别是如果经常使用,则将其定义在(和/或)中以方便使用会很有利;但这取决于个人喜好。hnscpssh"${_%%:*}"me@host.bashrchost~/.ssh/config

答案2

编写自己的脚本 — 例如:

#!/bin/bash

src_file=$1
dst=$2

test -n "$src_file" || exit 1
test -n "$dst" || exit 1

dst_login=${dst%%:*}

if scp $src_file $dst; then
    echo
    echo "scp succeeded, starting ssh session ..."
    ssh $dst_login
else
    echo "scp failed. Not stargin ssh session."
    exit 1
fi

将以上内容保存到文件中,使其可执行(chmod a+x scp-and-ssh),运行(./scp-and-ssh somefile me@somehost:somefile)。

~/.ssh/config顺便说一句:您可以在某个部分中设置远程用户名Host。这样,您只需指定远程主机名,就可以省去很多me@麻烦。

答案3

两次打字me@host可能会很烦人。

这就是它ssh_config的用途。您可以存储主机的用户名和别名:

Host short
  Hostname host
  User me

这将节省您的输入时间,最终您只会得到scp file short:path; ssh short。可能不是您要搜索的答案,但是

  • 有自动完成功能
  • 比别名或变量更少的 hack
  • 对我来说这比输入一些奇怪的字符更容易;)

相关内容