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
ملحوظة:
- يتكثف التالية وينظم إجابات أخرى في هذا الموضوع ، وإسبانيا عمل ممتاز من وسيرج Stroobandt
- Lasiewski وأنا أوصي Ch 19 (هنا المستندات) في دليل المتقدم Bash-Scripting
السؤال (كيفية كتابة مستند هنا (aka heredoc ) إلى ملف في bash script؟) (على الأقل) 3 أبعاد رئيسية مستقلة أو subquestions:
- هل تريد الكتابة فوق ملف موجود أو إلحاق ملف موجود أو الكتابة إلى ملف جديد؟
- هل يمتلك المستخدم أو مستخدم آخر (على سبيل المثال ،
root
) الملف؟ - هل تريد أن تكتب محتويات heredoc حرفيا ، أو أن يكون bash في تفسير المراجع المتغيرة داخل heredoc الخاص بك؟
(هناك أبعاد / طلبات فرعية أخرى لا أعتبرها مهمة. فكر في تحرير هذه الإجابة لإضافتها!) فيما يلي بعضًا من التوليفات الأكثر أهمية لأبعاد السؤال المذكور أعلاه ، مع محددات تعريفات مختلفة ومختلفة - لا يوجد شيء مقدسًا حول EOF
، فقط تأكد من أن السلسلة التي تستخدمها كمعرّف التعريف الخاص بك لا تحدث داخل heredoc:
للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، قم باستبدال المراجع المتغيرة داخل 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
لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، قم باستبدال المراجع المتغيرة داخل 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
للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، مع المحتويات الحرفية للرابط:
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
لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) تملكه ، مع المحتويات الحرفية للرابط:
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
للكتابة فوق ملف موجود (أو الكتابة إلى ملف جديد) مملوك من قبل الجذر ، استبدال المراجع المتغيرة داخل الملف 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
لإلحاق ملف موجود (أو الكتابة إلى ملف جديد) يملكه 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