linux - شرح - كيفية عمل script




كيف يمكنني كتابة ملف للرابط إلى ملف في النص الباش؟ (5)

كيف يمكنني كتابة مستند هنا لملف في النص الباش؟


عندما تكون أذونات الجذر مطلوبة

عندما تكون أذونات الجذر مطلوبة للملف الوجهة ، استخدم |sudo tee بدلاً من > :

cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF

اقرأ دليل Bash-Scripting المتقدم الفصل 19. هنا المستندات .

إليك مثالاً لكتابة المحتويات إلى ملف على /tmp/yourfilehere

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

LimitString أن اﻟﻨﺴﺨﺔ اﻟﻨﻬﺎﺋﻴﺔ "EOF" ( LimitString ) ﻻ ﻳﺠﺐ أن ﻳﻜﻮن ﻟﻬﺎ أي ﻣﺴﺎﻓﺔ أﻣﺎم اﻟﻜﻠﻤﺔ ، ﻷﻧﻬﺎ ﺗﻌﻨﻲ أﻧﻪ ﻟﻦ ﻳﺘﻢ اﻟﺘﻌﺮف ﻋﻠﻰ LimitString .

في برنامج نصي shell ، قد تحتاج إلى استخدام المسافة البادئة لجعل الشفرة قابلة للقراءة ، ولكن هذا يمكن أن يكون له تأثير غير مرغوب فيه لإدراج النص في المستند الخاص بك هنا. في هذه الحالة ، استخدم <<- (متبوعًا بشرطة) لتعطيل علامات التبويب الرائدة ( لاحظ أنه لاختبار ذلك ، ستحتاج إلى استبدال المسافة البيضاء الرائدة بحرف علامة تبويب ، حيث لا يمكنني طباعة أحرف علامة التبويب الفعلية هنا.)

#!/usr/bin/env bash

if true ; then
    cat <<- EOF > /tmp/yourfilehere
    The leading tab is ignored.
    EOF
fi

إذا كنت لا ترغب في تفسير المتغيرات في النص ، فاستخدم علامات الاقتباس الفردية:

cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF

لتوجيه الوراثة عبر خط أنابيب الأوامر:

cat <<'EOF' |  sed 's/a/b/'
foo
bar
baz
EOF

انتاج:

foo
bbr
bbz

... أو كتابة الوصية إلى ملف باستخدام sudo :

cat <<'EOF' |  sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF

بدلاً من استخدام cat وإعادة توجيه I / O قد يكون من المفيد استخدام tee بدلاً من ذلك:

tee newfile <<EOF
line 1
line 2
line 3
EOF

وهو أكثر إيجازًا ، بالإضافة إلى أنه بخلاف مشغل إعادة التوجيه ، يمكن دمجه مع sudo إذا كنت بحاجة إلى الكتابة إلى الملفات ذات أذونات الجذر.


على سبيل المثال ، يمكنك استخدامه:

أولاً (إجراء اتصال ssh):

while read pass port user ip files directs; do
    sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files [email protected]$ip:$directs
done <<____HERE
    PASS    PORT    USER    IP    FILES    DIRECTS
      .      .       .       .      .         .
      .      .       .       .      .         .
      .      .       .       .      .         .
    PASS    PORT    USER    IP    FILES    DIRECTS
____HERE

الثاني (تنفيذ الأوامر):

while read pass port user ip; do
    sshpass -p$pass ssh -p $port [email protected]$ip <<ENDSSH1
    COMMAND 1
    .
    .
    .
    COMMAND n
ENDSSH1
done <<____HERE
    PASS    PORT    USER    IP
      .      .       .       .
      .      .       .       .
      .      .       .       .
    PASS    PORT    USER    IP    
____HERE

الثالث (تنفيذ الأوامر):

Script=$'
#Your commands
'

while read pass port user ip; do
    sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port [email protected]$ip "$Script"

done <<___HERE
PASS    PORT    USER    IP
  .      .       .       .
  .      .       .       .
  .      .       .       .
PASS    PORT    USER    IP  
___HERE

الرابع (باستخدام المتغيرات):

while read pass port user ip fileoutput; do
    sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port [email protected]$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
    #Your command > $fileinput
    #Your command > $fileinput
ENDSSH1
done <<____HERE
    PASS    PORT    USER    IP      FILE-OUTPUT
      .      .       .       .          .
      .      .       .       .          .
      .      .       .       .          .
    PASS    PORT    USER    IP      FILE-OUTPUT
____HERE

ملحوظة:

السؤال (كيفية كتابة مستند هنا (aka heredoc ) إلى ملف في bash script؟) (على الأقل) 3 أبعاد رئيسية مستقلة أو subquestions:

  1. هل تريد الكتابة فوق ملف موجود أو إلحاق ملف موجود أو الكتابة إلى ملف جديد؟
  2. هل يمتلك المستخدم أو مستخدم آخر (على سبيل المثال ، root ) الملف؟
  3. هل تريد أن تكتب محتويات heredoc حرفيا ، أو أن يكون bash في تفسير المراجع المتغيرة داخل heredoc الخاص بك؟

(هناك أبعاد / طلبات فرعية أخرى لا أعتبرها مهمة. فكر في تحرير هذه الإجابة لإضافتها!) فيما يلي بعضًا من التوليفات الأكثر أهمية لأبعاد السؤال المذكور أعلاه ، مع محددات تعريفات مختلفة ومختلفة - لا يوجد شيء مقدسًا حول EOF ، فقط تأكد من أن السلسلة التي تستخدمها كمعرّف التعريف الخاص بك لا تحدث داخل heredoc:

  1. للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، قم باستبدال المراجع المتغيرة داخل heredoc:

    cat << EOF > /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    EOF
    
  2. لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، قم باستبدال المراجع المتغيرة داخل heredoc:

    cat << FOE >> /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    FOE
    
  3. للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، مع المحتويات الحرفية للرابط:

    cat << 'END_OF_FILE' > /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    END_OF_FILE
    
  4. لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، مع المحتويات الحرفية للرابط:

    cat << 'eof' >> /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    eof
    
  5. للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) مملوك من قبل الجذر ، استبدال المراجع المتغيرة داخل الملف heredoc:

    cat << until_it_ends | sudo tee /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, with the variable contents substituted.
    until_it_ends
    
  6. لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) يملكه user = foo ، مع المحتويات الحرفية للرابط:

    cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
    This line will write to the file.
    ${THIS} will also write to the file, without the variable contents substituted.
    Screw_you_Foo
    




heredoc