Я также хотел бы добавить свой собственный индикатор выполнения
Он достигает точности субсимволов, используя половину блоков Unicode
Код включен
Вы можете попробовать что-то вроде этого:
scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO')
Чтобы разрешить значение переменной $(ssh host2@host2_address 'printf $FOO')
, оболочка внутренне выполнит команду ssh host2@host2_address 'printf $FOO'
и примет все, что эта команда напечатает как значение переменной, которая затем подставляется во внешнюю команду scp
. Понятно, конечно, что вы должны извлечь переменную $FOO
из host2, потому что host1 просто не знает об этом. Один из способов получить его - использовать ssh
, как в приведенной выше команде.
Mind:
Вы должны иметь какую-то аутентификацию с открытым ключом, чтобы внутренняя команда ssh
работала без какого-либо дополнительного ввода данных пользователем. В противном случае, из-за внутреннего ssh
и внешнего scp
, вам будет предложено ввести пароль дважды.
Вы должны убедиться, что внутренняя команда ssh
выводит только переменную $FOO
. Попробуйте сами, прежде чем использовать его во внешней команде scp
, и убедитесь, что он работает.
По какой-то причине я не совсем понимаю, когда я тестировал команду, которую я написал выше, она не работала бы так, как ожидалось, потому что извлеченная переменная содержала бы какой-то странный префикс управления. Например, когда я пытался скопировать что-то на удаленный $HOME
, он пытался скопировать это в \033k$HOME\033\\/home/user
вместо простого /home/user
. Мне пришлось использовать следующее, чтобы заставить его работать:
scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO' | cut -d\\ -f2)
... где $FOO
было $HOME
в моем конкретном случае, конечно.
Это быстрое (поскольку оно довольно короткое) и динамическое (так как оно будет извлекать переменную на лету) решение, которое я придумал. Однако, особенно из-за последнего пункта, я думаю, что было бы более надежным иметь скрипт, который извлекает удаленные переменные, сначала печатая их в файл. Точнее, этот сценарий на хосте 1 будет подключаться к хосту 2, удаленно печатать вывод printenv
в некоторый файл на хосте 2, извлекать этот файл с хоста 2, анализировать его и экспортировать значения в локальные переменные среды. Например, переменная $FOO
на host2 может быть помещена в переменную $HOST2_FOO
на host1. Следующий скрипт будет делать это:
#!/bin/bash
ssh host2@host2_address 'printenv > host2_vars.txt'
scp host2@host2_address:host2_vars.txt .
#ssh host2@host2_address 'rm host2_vars.txt' #if you like to clean up
eval $(cat host2_vars.txt | perl -pe 's/^(.*)=(.*)$/export HOST2_$1="$2"/g')
Конечно, вам придется выполнить этот скрипт перед командой scp
.
Я бы посоветовал сбежать от доллара
scp file host2@host2_adress:"\$FOO"