Как выполнить пакетное перенаправление для команд с опциями

#batch-file #redirect #scp

Вопрос:

Я пытаюсь выполнить ряд команд, для которых требуется пароль пользователя, поэтому я запрашиваю пароль в начале сценария и перенаправляю команду с помощью | (перенаправление по каналу).

В документации я нашел синтаксис:

 set password=secretpassword
echo %password% | command that prompt for password
 

Я попытался с помощью команды scp скопировать один файл с сервера со следующим кодом:

 echo %password% | scp myuser@serverip:/home/myuser/myfile ./myfile
 

но это не сработало.

Но этот код почему-то работает:

 echo %password | %scp myuser@serverip:/home/myuser/myfile ./myfile
 

Я не понял, почему, возможно, интерпретация трубы внутри %% отличается.

Основная проблема заключается в том, что, когда я передаю параметры команде, например, рекурсивно получаю папку, это не работает. Пример:

 echo %password | %scp -r myuser@serverip:/home/myuser/myfolder ./myfolder
 

Я знаю, что есть и другие лучшие методы, такие как использование аутентификации по паре ключей вместо пароля, но я хочу понять, почему это не работает.

Комментарии:

1. %password | % это абсолютно НЕ ДОЛЖНО работать, и в вашем пароле почти наверняка есть какой-то символ, который делает вещи странными.

2. Вероятно, тот самый ! или символ@.. Но это вводится пользователем, есть ли какой-нибудь способ избежать этого текста? Если я использую echo %password% ! отсутствует, но с echo !password! тем ! есть, но перенаправление на scp не работает

3. Не прямое решение вашей проблемы, а подсказка. ssh и его друзья должны использоваться с открытыми/закрытыми ключами, а не с паролями

4. echo %password% | … отображает содержимое переменной password с последующим пробелом в канале; лучшее использование cmd /D /V /C echo(!password!| … (учитывая, что в экземпляре интерпретатора команд хостинга отключено отложенное расширение)…