Как предложил @Kusalananda, используйте агент ssh -. Поскольку вы уже входите в систему через ssh, простое создание экземпляра агента ssh -для выполнения скрипта должно работать нормально.
eval $(ssh-agent)
ssh-add
Вы можете добавить несколько ключей ssh к одному и тому же агенту ssh -. ssh-add
добавляет тот, который находится в расположении по умолчанию. Если ваша пара открытый/закрытый ключ не находится в расположении по умолчанию, добавьте их в команду ssh -add.
Также возможно запустить агент ssh -при входе в систему, если вы используете его вне этого скрипта.
редактировать :Я предполагаю, что завершение работы агента ssh -после завершения скрипта на удаленном сервере — хорошая идея, особенно. если кто-то еще получил root-доступ, можно прочитать ваш пароль. Если вы хотите получить полностью безопасное решение, ознакомьтесь с этой статьей .
С GNU sed и tac:
tac bad.json | sed '0,/"topic"/s/,$//' | tac
Если в конце строки есть пробелы, измените шаблон на,[[:blank:]]*$
Выполнено методом Python
#!/usr/bin/python
import re
k=re.compile(r',$')
t=open('filename','r')
l=[]
for i in t:
l.append(i.strip())
for h in range(0,len(l),1):
if (h <15):
print l[h]
else:
print re.sub(k,"",l[h])
выход
{"topic":"life_is_hard","partition":84,"replicas":[1006,1003]},
{"topic":"life_is_hard","partition":85,"replicas":[1001,1004]},
{"topic":"life_is_hard","partition":86,"replicas":[1002,1005]},
{"topic":"life_is_hard","partition":87,"replicas":[1003,1006]},
{"topic":"life_is_hard","partition":88,"replicas":[1004,1001]},
{"topic":"life_is_hard","partition":89,"replicas":[1005,1002]},
{"topic":"life_is_hard","partition":90,"replicas":[1006,1004]},
{"topic":"life_is_hard","partition":91,"replicas":[1001,1005]},
{"topic":"life_is_hard","partition":92,"replicas":[1002,1006]},
{"topic":"life_is_hard","partition":93,"replicas":[1003,1001]},
{"topic":"life_is_hard","partition":94,"replicas":[1004,1002]},
{"topic":"life_is_hard","partition":95,"replicas":[1005,1003]},
{"topic":"life_is_hard","partition":96,"replicas":[1006,1005]},
{"topic":"life_is_hard","partition":97,"replicas":[1001,1006]},
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]}
Используя GNU sed
в режиме расширенного регулярного выражения -r
, мы можем сделать это следующим образом:
sed -ri -e '
/"topic"/{
x;1!p;ba
}
H;1h;:a;$!d;g
//s/^([^\n]+),(\n|$)/\1\2/
' file
Основная идея состоит в том, чтобы собрать строки, начинающиеся с "topic"
, содержащие строку к следующему (, как бы дальше он ни находился )в трюмном пространстве. тогда когда мы, в конце концов, придем к концу, мы удалим ,
с конца строка (=> строка "тема" была последней строкой )или первой новой строкой (=> "тема" была последней в файле, но за ней следовала еще не -тема строки, прежде чем мы нажмем eof.)
Вот так:
sed -i '${s/,[[:blank:]]*$//}' file
Эта команда заменяет файл на лету .
команда
sed '$s/,$//g' filename
выход
{"topic":"life_is_hard","partition":84,"replicas":[1006,1003]},
{"topic":"life_is_hard","partition":85,"replicas":[1001,1004]},
{"topic":"life_is_hard","partition":86,"replicas":[1002,1005]},
{"topic":"life_is_hard","partition":87,"replicas":[1003,1006]},
{"topic":"life_is_hard","partition":88,"replicas":[1004,1001]},
{"topic":"life_is_hard","partition":89,"replicas":[1005,1002]},
{"topic":"life_is_hard","partition":90,"replicas":[1006,1004]},
{"topic":"life_is_hard","partition":91,"replicas":[1001,1005]},
{"topic":"life_is_hard","partition":92,"replicas":[1002,1006]},
{"topic":"life_is_hard","partition":93,"replicas":[1003,1001]},
{"topic":"life_is_hard","partition":94,"replicas":[1004,1002]},
{"topic":"life_is_hard","partition":95,"replicas":[1005,1003]},
{"topic":"life_is_hard","partition":96,"replicas":[1006,1005]},
{"topic":"life_is_hard","partition":97,"replicas":[1001,1006]},
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]}