Как передать файлы через SSH с использованием Base64
Перемещение файлов на сервер через SSH может представлять определенные сложности, особенно если у вас есть доступ только к единственному сеансу, и вы не хотите терять связь с сервером. В этом руководстве мы рассмотрим, как закодировать файл в формат Base64 и передать его через терминал.
Почему Base64?
Преобразование файла в формат Base64 позволяет передавать данные в текстовом виде, что может оказаться полезным в средах, где бинарные данные могут быть испорчены или неправильно интерпретированы. Кроме того, данный метод особенно актуален, если у вас ограниченные возможности доступа к серверу.
Подготовка к передаче файла
Для начала вам необходимо закодировать файл в формат Base64. Это можно сделать с помощью различных утилит, однако, если у вас только среда BusyBox, может не быть доступной стандартной команды base64
. В данном случае мы используем awk
скрипт для декодирования на стороне сервера.
Декодирование Base64 с помощью AWK
Если у вас нет возможности воспользоваться встроенной командой base64
, вы можете использовать следующий скрипт на awk
, чтобы декодировать файл:
# base64decode.awk
#
# Introduction
# ============
# Decode Base64-encoded strings.
#
# Invocation
# ==========
# Typically you run the script like this:
#
# $ awk -f base64decode.awk [file1 [file2 [...]]] > output
# create our lookup table
BEGIN {
# load symbols based on the alphabet
for (i=0; i<26; i++) {
BASE64[sprintf("%c", i+65)] = i
BASE64[sprintf("%c", i+97)] = i+26
}
# load our numbers
for (i=0; i<10; i++) {
BASE64[sprintf("%c", i+48)] = i+52
}
# and finally our two additional characters
BASE64["+"] = 62
BASE64["/"] = 63
# also add in our padding character
BASE64["="] = -1
}
# The main function to decode Base64 data.
# Arguments:
# * encoded - the Base64 string
# * result - an array to return the binary data in
function base64decode(encoded, result) {
n = 1
while (length(encoded) >= 4) {
g0 = BASE64[substr(encoded, 1, 1)]
g1 = BASE64[substr(encoded, 2, 1)]
g2 = BASE64[substr(encoded, 3, 1)]
g3 = BASE64[substr(encoded, 4, 1)]
# Проверка на некорректные символы
if (g0 == "") { printf("Unrecognized character %c in Base 64 encoded string\n", g0) >> "/dev/stderr"; exit 1 }
if (g1 == "") { printf("Unrecognized character %c in Base 64 encoded string\n", g1) >> "/dev/stderr"; exit 1 }
if (g2 == "") { printf("Unrecognized character %c in Base 64 encoded string\n", g2) >> "/dev/stderr"; exit 1 }
if (g3 == "") { printf("Unrecognized character %c in Base 64 encoded string\n", g3) >> "/dev/stderr"; exit 1 }
# Декодирование данных
result[n++] = (g0 * 4) + int(g1 / 16)
if (g2 != -1) {
result[n++] = ((g1 * 16) % 256) + int(g2 / 4)
if (g3 != -1) {
result[n++] = ((g2 * 64) % 256) + g3
}
}
encoded = substr(encoded, 5)
}
# Проверка на лишние символы
if (length(encoded) != 0) {
printf("Extra characters at end of Base 64 encoded string: \"%s\"\n", encoded) >> "/dev/stderr"
exit 1
}
}
# Основная обработка текста
{
# Декодируем то, что мы прочитали
base64decode($0, result)
# Выводим декодированную строку
printf_str = ""
for (i=1; i in result; i++) {
printf_str = printf_str sprintf("\\%03o", result[i])
if (length(printf_str) >= 1024) {
system("printf '" printf_str "'")
printf_str = ""
}
delete result[i]
}
system("printf '" printf_str "'")
}
Как использовать скрипт
Чтобы воспользоваться данным скриптом для декодирования файла, выполните следующую команду после подключения к серверу через SSH:
awk -f base64decode.awk [файл с Base64] > output_file
Этот код декодирует содержимое файла, закодированное в Base64, и сохраняет результат в output_file
.
Заключение
Передача файлов через SSH может быть довольно простой задачей, если вы знаете, как использовать Base64. Применяя предложенные методы, вы сможете сохранить доступ к своему серверу и при этом успешно передать необходимые данные.