Команда exec в цикле bash для веб-сканирования

Экземпляр ec2 можно идентифицировать по его instance-id, который никогда не изменится, независимо от того, сколько раз вы останавливали и запускали экземпляр. Если у вас есть идентификатор экземпляра и вам нужен его IP-адрес, вы можете попробовать следующее.

Для публичного IP-адреса:

aws ec2 describe-instances --instance-ids i-b78a096f | grep PublicIpAddress | awk -F ":" '{print $2}' | sed 's/[",]//g'

Для частного IP-адреса:

aws ec2 describe-instances --instance-ids i-b78a096f | grep PrivateIpAddress  | head -1 | awk -F ":" '{print $2}' | sed 's/[",]//g'

Тем не менее, я думаю, что будет намного лучше, если вы попробуете сделать то же самое на python. Я реализовал ту же логику в своей предыдущей организации с помощью библиотеки python boto, и это было намного проще и управляемее.

настройка виртуального env:

#!/usr/bin/env bash

set -e
HOME_DIR=/home/$(whoami)

#Dependencies
sudo apt-get install ncurses-devel patch openssl openssl-devel zlib-devel

# Install python locally
mkdir -p $HOME_DIR/src
mkdir -p $HOME_DIR/.localpython
cd $HOME_DIR/src
wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar -zxvf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=$HOME_DIR/.localpython 
make
make install

# Install virtualenv locally
cd $HOME_DIR/src
wget --no-check-certificate https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz#md5=f61cdd983d2c4e6aeabb70b1060d6f49
tar -zxvf virtualenv-1.11.6.tar.gz
cd virtualenv-1.11.6/
~/.localpython/bin/python setup.py install 


# Create a test virtual environment
mkdir -p $HOME_DIR/virtualenvs
cd $HOME_DIR/virtualenvs
~/.localpython/bin/virtualenv my_virtual_env --python=$HOME_DIR/.localpython/bin/python2.7
cd my_virtual_env
source bin/activate
pip install awscli
1
04.05.2019, 05:38
2 ответа

Это, безусловно, связано с тем, как вы закрываете дескриптор файла, который вы открыли ранее для стандартного ввода. Использование ниже должно быть в порядке

exec 10<&- 

Когда вы выполняете 0<10, вы указываете оболочке искать и поглощать содержимое файла с именем 10в вашем текущем каталоге, что делает бессмысленным в данном контексте.

В bashвы также можете использовать альтернативную форму exec 10>&-, которая достигает той же цели закрытия дескриптора.

Но при этом вам не нужно использовать execдля произвольного файлового дескриптора и читать ввод, вы можете просто прочитать ввод с помощью метода подстановки процесса в bashформы < <()как

while IFS= read -r line; do
    arr["$count"]="$line"
    ((count++))
done< <(pgtoscrap)
6
27.01.2020, 23:11

exec 10<&0клонирует дескриптор файла с номера 0 в номер 10, эффективно сохраняя оригинал, чтобы вы могли заменить файл на fd 0 в следующей строке. Чтобы отменить это, вам нужно поменять местами числа, клонировать номер 10 в номер 0, exec 0<&10(, а затем закрыть fd 10 с помощьюexec 10<&-).

С другой стороны, exec 0<10без амперсанда — это просто перенаправление с именем файла 10. Поскольку у вас нет такого файла, вы получите сообщение об ошибке.


Тем не менее, вам не нужно использовать execдля временной настройки перенаправления для цикла while. Составные команды также могут принимать перенаправления, например:

while read LINE; do
   ...
done < "$filename"

Если вы хотите читать полные строки, как они есть, без пробелов или обратной косой черты, влияющих на данные, вам нужно сбросить IFSдля readи использовать read -r. Кроме того, если вы добавляете к массиву, вам не нужно вручную следить за индексами, вы можете просто использовать +=для добавления непосредственно в массив:

arr=()   # declares it an array and clears it, not strictly necessary though
while IFS= read -r line; do
    arr+=("$line")
done < "$filename"

Или используйтеmapfile(readarray)вместо ручного цикла, как @BlackJack упоминает в комментариях:

mapfile -t arr < "$filename"

Или вообще без временного файла:

#/bin/bash
mapfile -t arr < <(curl -s https://unix.stackexchange.com/)

(Без -tmapfileоставляет ограничители строк на месте.)

4
27.01.2020, 23:11

Теги

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