একটি সিগিন্ট সিগন্যাল ফাঁদে দেওয়ার চেষ্টা করার সময় কেন আমি একটি ত্রুটি বার্তা পাব?


12

Lftp ব্যবহার করে কোনও সার্ভার থেকে স্বয়ংক্রিয়ভাবে ফাইলগুলি ডাউনলোড করতে আমি নীচের স্ক্রিপ্টটি চালাচ্ছি। এটি চালিত হয়ে গেলে আমি ত্রুটি বার্তাটি পাই except

trap: SIGINT: bad trap

আমি যদি INT এবং TERM এর সাথে SIGINT এবং SIGTERM প্রতিস্থাপন করি তবে এটি কার্যকর হয়, তবে আমি জানি না এটি যদি একই উদ্দেশ্য অর্জন করে তবে। এটি লিনাক্স ডেবিয়ান 4.9.2-10 এ রয়েছে।

#!/bin/sh
login="login"
pass="password"
host="server.server.com"
remote_dir='~/remote/dir'
local_dir="/local/dir"

base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
    echo "$base_name is running already."
    exit
else
    touch "$lock_file"
    /usr/bin/lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF
    set sftp:auto-confirm yes
    set mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit
fi

1
এই কোডটি কোন ব্যবহারকারী হিসাবে চালিত হয়? কেউ যদি দুষ্টু তৈরি করে ln -s /etc/passwd /tmp/$base_name.lockবা তার সমতুল্য হয়?
ট্রিগার করুন

উত্তর:


16

SIGউপসর্গটি ড্রপ করুন , কেবল সিগন্যালের নাম ইনপুট করুন:

trap "rm -f -- "$lock_file"" INT TERM

সমস্ত শেল SIGউপসর্গটি দিয়ে ইনপুটটি বোঝে / নেয় না , sh(সম্ভবত আপনি ব্যবহার করছেন dash) এর মধ্যে একটি।

অন্যদিকে, আরো সমৃদ্ধ শাঁস মত বৈশিষ্ট্য ksh, bash, zshঅনুমতি SIGসংকেত নাম সামনে উপসর্গ।


ধন্যবাদ! এটাই আমি চেষ্টা করেছি; আমি এটি নিশ্চিত করতে চেয়েছিলাম যে এটি একই কাজ করেছে।
উড়ন্তস্থান

@ ফ্লাইংএইস পরিবর্তে আপনার #!রেখাটি রেফারেন্সে পরিবর্তনের বিষয়ে বিবেচনা করতে পারেন । bashsh
রোয়াইমা

ইউহ dash, হাহ? আমি এর আগে এই শেলটির কথা শুনিনি ...
সেলডমনিডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.