Heredoc을 사용하여 실행할 때 파일 중단으로 인해 스크립트가 제대로 실행됩니다(PHMPmyadmin 설치에서).

Heredoc을 사용하여 실행할 때 파일 중단으로 인해 스크립트가 제대로 실행됩니다(PHMPmyadmin 설치에서).

전통적인 방법을 사용하여 다음 스크립트를 실행할 수 있습니다.

cd ~ && vi script.sh [PASTE SCRIPT INSIDE] && chmod +x script.sh && ./script.sh && rm -rf script.sh

그러나 Heredoc를 사용하여 똑같은 스크립트를 실행하면(Bash 프롬프트에서 직접 붙여넣고 실행) 스크립트가 부분적으로만 실행되고 끝나기 전에 중단됩니다.

예를 들어 Heredoc을 사용하여 다음 스크립트를 실행하면 어떤 일이 발생합니까?

PHPmyadmin 설치 인터페이스는 CLI와 통합되어 있으며 CLI 자체는 표준 입력 기록을 제외한 거의 모든 기능을 상실했습니다.

여기에 이미지 설명을 입력하세요.

스크립트(내 Heredoc과 함께):

bash << 'EOT0'

#!/bin/bash -x

# Setup LAMP environment with enabled mod rewrite:
cd ~
apt-get install lamp-server^ -y
a2enmod rewrite
cat << EOF >> /etc/apach2/apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EOF
service apache2 restart

# Setup Webmin and some dependencies:
apt-get install unzip perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python -y
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.810_all.deb
dpkg --install webmin_1.810_all.deb
apt-get -f install
sed -i 's/ssl=1/ssl=0/g' /etc/webmin/miniserv.conf
/etc/init.d/webmin restart

# Cron tasks:
echo -e "\07" && echo -e "\007" # Choose Nano (2) and do ^x.
USER=benqzq
crontab -u $USER -l 2>/dev/null
cat <<- 'EOF'
0 8 * * *  tar -zcvf /home/USERNAME/backups/files/www-html-$(date +\%F-\%T-).tar.gz /var/www/html
0 8 * * *  find /home/USERNAME/backups/files/* -mtime +30 -exec rm {} \;

0 8 * * *  mysqldump -u root -PASSWORD --all-databases > /home/USERNAME/backups/mysql/alldb_backup.sql
1 8 * * *  tar -zcvf /home/USERNAME/backups/mysql/alldb_backup-$(date +\%F-\%T-).sql.tar.gz /home/USERNAME/backups/mysql/alldb_backup.sql
2 8 * * *  rm /home/USER/backups/mysql/alldb_backup.sql
2 8 * * *  find /home/USERNAME/backups/mysql/* -mtime +30 -exec rm {} \;
EOF
crontab -e
USER=root

# Setup PMA:
echo -e "\07" && echo -e "\007"
apt-get install phpmyadmin php-mb\string php-gettext -y
phpenmod mcrypt && phpenmod mbstring
bash -c "echo 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf"
systemctl reload apache2.service

# Setup Fail2Ban:
apt-get install fail2ban -y

# Secure PMA HTTP authentication from BFAs with Fail2Ban:
cat << EOF > /etc/fail2ban/filter.d/phpmyadmin.conf
[Definition]
denied = mysql-denied|allow-denied|root-denied|empty-denied
failregex = ^<HOST> -.*(?:%(denied)s)$
ignoreregex =
EOF
cat << EOF >> /etc/fail2ban/jail.local
[phpmyadmin]
enabled = true
port = http,https
filter = phpmyadmin
logpath = /var/log/apache2/phpmyadmin_access.log
EOF

service  apache2 reload
service fail2ban reload
reboot

# Comment1
# Comment2
# Comment3
# ...

EOT0

Stephen Chazeras의 업데이트

여기에 이미지 설명을 입력하세요.

답변1

당신은하고 있습니다 :

bash << 'EOT'
some-command-that-reads-stdin
EOT

그러나 some-command-that-reads-stdin표준 입력은 bash동일한 stdin.

다음을 수행할 수 있습니다.

bash /dev/fd/3 3<< 'EOT'
some-command-that-reads-stdin
EOT

따라서 stdin은 동일하게 유지되며 bash코드는 다른 fd의 이 문서에서 가져옵니다.

답변2

아마도 잘못된 쉘을 사용하고있을 것입니다. bash << 'EOT0'과 사이의 빈 줄을 제거하겠습니다 #!/bin/bash -x.

다음 줄을 추가하여 어떤 쉘이 사용되는지 확인할 수 있습니다.

echo $SHELL >/tmp/shell.txt

그런 다음 간단한 고양이를 사용하여 결과를 확인합니다.

cat /tmp/shell.txt

관련 정보