scp+ssh+scp в одном соединении

Ответ на ваш вопрос зависит от того, может ли эта строка появляться только один раз или несколько раз в рассматриваемом PDF-файле (с ). Предполагая, что это может произойти только один раз, и рассматриваемая строка содержится как фактический текст (, т.е. не только в графической форме )следующий подход, который требует GNU Awk и внешнего инструмента pdftotext, должно работать (пример для одного файла, переданного в качестве параметра):

#!/bin/bash

OLDNAME="$1"

NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"

NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"

Функция matchфункции awkпроверяет наличие определенного паттерна и выводит «фактическое значение» паттерна в выходной массив a, где записи a[0]содержат весь найденный паттерн и a[1]- a[n]содержат «фактические значения» любых вложенных -выражений, заключенных в круглые скобки в шаблоне, в нашем случае «числовая часть» ([[:digit:]])( [[:digit:]])*в элементах массива 1 и 2 (ср. например. раздел GNU Awk User's Guide, посвященный «строковым функциям»). Если результат однозначный -, число a[2]останется пустым, что не имеет значения. Поскольку в случае двух цифр -пробел между цифрами также будет совпадать, мы используем функцию awkgsub(), чтобы удалить его в случае двух цифр -.

Чтобы применить его к нескольким файлам, вы можете изменить сценарий следующим образом, а затем передать весь список PDF-файлов в качестве аргумента (, например./rename.sh *.pdf).

#!/bin/bash

for OLDNAME in "$@"
do
    NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"

    NEWNAME="$NUMBER.$OLDNAME"
    mv "$OLDNAME" "$NEWNAME"
done

0
20.09.2021, 12:11
2 ответа

ш+ожидать

  1. Напишите сценарий shсо всеми тремя вашими командами, как они есть -вам все равно придется вводить пароль три раза, но это все равно будет проще сделать по сравнению с ручными командами.

  2. Если у вас есть сценарий, вы можете поиграть с expectи ввести пароль с его помощью. Но это можно считать небезопасным, так как с expectвы должны открыто хранить пароли в скрипте.

Лично я часто останавливаюсь на первом решении -вводить пароль несколько раз не очень сложно (просто раздражает ). Но если позволяет обстановка безопасности,-expectможет творить чудеса/

-1
20.09.2021, 12:58

Если это не было специально отключено, вы можете попробовать мультиплексирование. Это по-прежнему несколько команд, но поскольку для аутентификации используется только начальное основное соединение, а остальные команды выполняются по этому предварительно -аутентифицированному каналу, вы обнаружите, что оно выполняется быстрее :

.
# Set up master connection to target system
ssh -S "$HOME/.ssh.sock" -M -o ControlPersist=yes -fN user@server

# Perform the commands using the master connection
scp -o ControlPath="$HOME/.ssh.sock" localfile.jar user@server:path/
ssh -S "$HOME/.ssh.sock" user@server java -jar path/localfile.jar some argument >path/output.bin

# Tear down the master connection when you have finished
ssh -S "$HOME/.ssh.sock" -O exit user@server

Вам не нужна последняя команда из набора из трех примеров, потому что ваша команда sshуже помещает свой вывод в локальный файл path/output.bin.

Вы можете указать тайм-аут для основного сеанса, чтобы, если вы перестанете его использовать и забудете закрыть, он завершится автоматически (, например, ControlPersist=60вместо ControlPersist=yesна минуту -длительный тайм-аут ).

Если вы часто выполняете эти операции, возможно, стоит использовать ~/.ssh/ssh_configдля переопределения предпочтительных настроек по умолчанию для цели server.

2
20.09.2021, 16:32

Теги

Похожие вопросы