Параметр -i
означает, что curl будет включать заголовки ответа http, которые не в формате JSON. Это то, что вызывает вашу ошибку синтаксического анализа, однако, учитывая предоставленный вами json, вам нужно использовать []
, чтобы сообщить ему об итерации массива:
curl 'https://api.shodan.io/shodan/alert/info?key={API KEY}' | jq '.[].id'
альтернативно (и ИМО более интуитивно )с использованием json:
curl 'https://api.shodan.io/shodan/alert/info?key={API KEY}' | json -a id
Кроме того, json (1 )имеет параметр -H
для игнорирования заголовков ответов http, поэтому вы можете использоватьjson -Ha id
Помимо того, что написал @PhilipCouling, существует странная, но эффективная небольшая утилита, Spinner, полезная, когда интерактивный сеанс терминала должен оставаться открытым. Вы запускаете его на удаленном хосте. Он мало что делает, но отправляет фиктивный пакет данных обратно локальному клиенту каждые N секунд (Я использую N = 120, например ). Манекен поддерживает связь.
Не уверен, что вы хотели именно этого, но вот оно.
Простые улучшения
Этот метод позволяет разорвать соединение с удаленной машины. Я бы предложил пару изменений
sleep
в цикл while, нет смысла тратить процессорное время на ожидание Вам это нужно?
Если вы хотите только убить сеанс, я бы избегал метода в вашем вопросе и использовал:
SSH -N -D $port $SSH_HOST &
Это установит соединение без оболочки, поскольку фоновая задача(-N
отключает оболочку и &
делает ее фоновой задачей ).
Вы можете получить (локальный )PID для этого с помощью $!
и убить его с помощьюkill
Например:
SSH -N -D $port $SSH_HOST &
TUNNEL_PID=$!
# Do some other stuff
kill $TUNNEL_PID