Скопируйте файл через последовательное соединение

$ cat f.html
<h1>head</h1>
<p>hello</p>
<p>world</p>
$ grep -o '<p>.*</p>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g'  
<p>HELLO</p>
<p>WORLD</p>


# capture other tags: grep multi-pattern e.g 'patt1\|patt2\|pattN'
$ grep -o '<p>.*</p>\|<h1>.*</h1>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g'
<h1>HEAD</h1>
<p>HELLO</p>
<p>WORLD</p>

# add line after h1 tag : grep+tr+sed
function foo () {
    grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g' | while read line; do 
        case "${line}" in
            "<h1>"*)
                echo "${line}"
                echo "anything that should appear after h1 tags"
            ;;
            "<p>"*)
                echo "${line}"
            ;;
        esac
    done
}

$ foo f.html
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>

# add line after h1 tag : few [shell parameter expansion] tips + while & case statments 
function foo () {
    grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | while read line; do 
        case "${line}" in
            "<h1>"*)
                line="${line^^}"; #capitalize (shell parameter expansion)
                echo "${line//H1>/h1>}" # find replace (shell parameter expansion)
                echo "anything that should appear after h1 tags"
            ;;
            "<p>"* | "<P>"*) # if html files contain capitalized P tag and you wanna capture them 
                line="${line^^}"; #capitalize
                echo "${line//P>/p>}" # find replace
            ;;
            "<foo>"*)
                line="${line^^}"; #capitalize 
                linopenintag="${line//<foo>/}"; # <foo>hello world</foo> ==> hello world</foo>
                innerHTML="${linopenintag//<\/foo>/}"; # hello world</foo> ==> hello world
                innerHTMLarr=(${innerHTML});  # in case i want to put each word in a spin or/and style that word differently 

                for eachword in ${innerHTMLarr[@]}; do
                    if [[ "${eachword}" == "something" ]]; then # capture special words... 
                        echo "<bar style='...'> ${eachword} </bar>"
                    else
                        echo "<bar> ${eachword} </bar>"
                    fi
                done

            ;;
        esac
    done
}
$ foo f.html 
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>
3
23.10.2019, 01:03
2 ответа

Одна из возможностей состоит в том, чтобы закодировать двоичный файл как текст ASCII, используя либо традиционный uuencode , либо несколько более современный base64. Программы uuencodeи uudecodeвходят в состав пакета sharutils , а base64— в coreutils . Похоже, что base64уже присутствует в современном дистрибутиве GNU/Linux.

Результатом кодирования двоичного файла является большой объем текста, который в принципе можно скопировать/вставить по терминальному соединению в декодер на target. При большом количестве данных использование буфера обмена может быть нецелесообразным, но мы можем использовать средства screenдля вставки содержимого файла в терминал.

  1. На sourceзапустите base64 FILE > FILE.b64.
  2. В сеансе screen, подключенном к target, введите Ctrl -A :readreg p /path/to/FILE.b64. (Если ваша управляющая клавиша screenотличается от Ctrl -A, введите ее. )Кажется, вы должны указать полный путь к FILE.b64; ~не работает. Экран должен сообщить что-то вроде «В буфер введено 26665052 символа».
  3. В консоли на targetзапустите base64 -d > FILE.
  4. Введите Ctrl -A :paste p.
  5. Введите Ctrl -D.

Другим давно -проверенным способом решения этой проблемы является ZModem , почтенный метод передачи файлов через терминальные соединения. Поддержка ZModem встроена во многие эмуляторы терминала, такие как Konsole, если установлен пакет lrzsz. Однако есть вероятность, что lrzsz не установлен, поэтому лучше использовать base64.

Все эти методы решают проблему передачи файла по последовательному каналу, который вы используете в данный момент для консоли. Если вам не нужна консоль, будет проще сделать так, чтобы targetвыгружала что-либо из ссылки в файл; но это будет проблематично, если последовательная консоль — ваш единственный способ взаимодействия с устройством!

2
27.01.2020, 21:24

Основываясь на ответах всех и учитывая установленные утилиты на target, я нашел решение, которое работает, выполняя скрипт только из source. Сценарий выглядит следующим образом:

dest="/dev/$(dmesg | grep "now attached to ttyUSB" | awk '{print$NF}' | tail -1)"
cat binfile | gzip | base64 > binfile.64.gz
md5=$(md5sum binfile | awk '{print $1}')
printf "\necho \"[ \\\$(md5sum <target-dir>/binfile | awk '{print \\\$1}') == %s ] &&\\ 
<flashing commands>\" > <target-dir>/flash.sh\n" \
    "$md5" \
    > "$dest"
printf " echo \"%s\" | base64 -d | gunzip > <target-dir>/binfile &&\\
/bin/sh <target-dir>/flash.sh
" "$(cat binfile.64.gz)" \
    > "$dest"

Он отправляет программу прошивки, которая проверяет, совпадают ли контрольные суммы исходного и целевого bin-файлов
сжимает и кодирует bin-файл,
посылает его,
и использует программу прошивки для прошивки карты. Если что-то сломается при кодировании/декодировании, оно не должно прошивать цель. Любая другая проблема вряд ли вызовет проблемы в системе, поскольку простая перезагрузка вернет ее в состояние по умолчанию.

Вот ссылка на мою полную реализацию этого процесса:
https://github.com/Soulthym/cycloneV-serial-flasher

2
27.01.2020, 21:24

Теги

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