我经常做这样的事:
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
ssh
scp
到上一个命令中使用的主机
好吧,因为根据您的评论,me@host
变量中的存储是1;我们必须采用另一种更聪明的方式来做:
$ scp somefile me@host:/some/path
$ ssh "${_%%:*}"
这将使ssh
你me@host
。
解释
$_
调用上一个命令的最后一个参数。该%%
构造删除最长匹配自后退字符串。:*
匹配从冒号 ( :
) 开始的所有内容。
因此"${_%%:*}"
删除从:
上一个命令开始的所有内容(即:/some/path
)离开me@host
。
测试使用GNU bash, version 4.3.30(1)-release
1如果您问我,在和命令中执行hn=me@host
然后使用比使用更容易。特别是如果经常使用,则将其定义在(和/或)中以方便使用会很有利;但这取决于个人喜好。hn
scp
ssh
"${_%%:*}"
me@host
.bashrc
host
~/.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
- 对我来说这比输入一些奇怪的字符更容易;)