1

Я часто делаю такие вещи:

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 .

3 ответа3

1

ssh к хосту использовался в предыдущей команде scp

Ну, так как согласно вашему комментарию хранение me@host в переменной вышло 1 ; мы должны сделать это другим, более умным способом:

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

Это будет ssh вы me@host .

объяснение

$_ вызывает последний аргумент предыдущей команды. Конструкция %% удаляет самое длинное совпадение в конце строки. :* Соответствует всем от двоеточия : и далее.

Поэтому "${_%%:*}" удаляет все, начиная с : on в предыдущей команде (то есть :/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) для удобства использования; но это зависит от индивидуальных предпочтений.

1

Напишите себе сценарий - например:

#!/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), runit (./scp-and-ssh somefile me@somehost:somefile).

Кстати: вы можете установить имя удаленного пользователя в вашем ~/.ssh/config в разделе Host . Таким образом, вам нужно всего лишь указать имя удаленного хоста и можете оставить me@ стороне.

1

Напечатать me@host дважды может быть утомительно.

Вот для чего ssh_config . Вы можете сохранить имя пользователя и псевдоним для своего хоста:

Host short
  Hostname host
  User me

что спасет вас от печати, и вы получите только scp file short:path; ssh short . Вероятно, не ответ, который вы ищете, но

  • есть автоматическое завершение
  • гораздо меньше взломать, чем псевдоним или переменную
  • мне кажется проще, чем набирать какие-то странные символы;)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .