एक कमांड चलाएं जिसमें एक समय बीतने के बाद सूडो की आवश्यकता होती है


30

मैं आमतौर पर करता हूं

sleep 4h; command

4h के बाद एक कमांड निष्पादित करने के लिए। हालाँकि, यदि उस आदेश की आवश्यकता है sudo, तो यह काम नहीं करेगा।

क्या sudoइस समय मैं sleepकमांड चला रहा हूं, इसकी अनुमति देना संभव है ?


कुछ इस तरह से unix.stackexchange.com/questions/391796/…
MatsK

उस विशेष मामले में मुझे लगता है कि आप बस का उपयोग कर सकते हैं shutdown। एक विशिष्ट समय पर नींद को शेड्यूल करने के लिए सूडो और उचित तर्कों के साथ कमांड करें।
oarfish


आपको क्या कार्य करने की आवश्यकता है, और सटीक 4 घंटे की नींद क्यों?
थोरबजोरन रावन एंडरसन

जवाबों:


46

sudoरूट शेल शुरू करने के लिए उपयोग करें जहां आप कमांड चलाते हैं:

sudo bash -c 'sleep 4h; command'

रूट शेल में चलने वाला प्रत्येक कमांड रूट अनुमतियों के साथ चलता है, जिसके लिए sleepचोट नहीं लगती है। यदि आपको इसमें उपयोगकर्ता अनुमतियों के साथ एक कमांड चलाने की आवश्यकता है sudo -u USERNAME COMMAND, उदाहरण के लिए , उपयोग करें :

$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert  # whoami run as user dessert
root     # whoami run as root

sudo visudoरूट एक्सेस के बिना कमांड के निष्पादन की अनुमति देने के लिए उपयोग करने के लिए एक और दृष्टिकोण होगा , देखें: sudo का उपयोग करके पासवर्ड के लिए निष्पादन के बिना निष्पादन की अनुमति कैसे दें?
ध्यान दें कि कमांड के आधार पर यह सुरक्षा दोष पैदा कर सकता है।


21

यह मानते हुए कि आप केवल एक बार प्रक्रिया को चलाना चाहते हैं (उदाहरण के लिए, हर 4 घंटे में) तो आप उपयोग कर सकते हैं atd

  1. सुनिश्चित करें कि atd चल रहा है (ubuntu में जो /etc/init.d/atd statusअभी भी बेहतर है systemctl status atd)
  2. एक टर्मिनल पर रूट के रूप में आपकी कमांड इस प्रकार है:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. यदि आप इसे हर 4 घंटे में चलाना चाहते हैं, तो आप अपने क्रॉन्टाब में निम्नलिखित विन्यास के साथ क्रोन (रूट के रूप में) का उपयोग कर सकते हैं

    0 */4 * * * sh -c $'/path/to/command'

2
हां, atइस नौकरी के लिए सही उपकरण है, क्योंकि यह I / O पुनर्निर्देशन का भी ध्यान रखता है, शेल विंडो को ब्लॉक नहीं करता है, और तब भी काम करता है जब उपयोगकर्ता लॉग आउट कर चुका होता है या मशीन को रिबूट किया गया होता है।
साइमन रिक्टर

4
@SimonRichter: बैकग्राउंड में सूडो लगाना sudo bash -c 'sleep 4h && command' &शेल विंडो / टैब को ब्लॉक न करने का एक आसान तरीका है। यदि आप चाहते हैं कि आउटपुट असिंक्रोनस रूप से एक अनुस्मारक के रूप में पॉप हो जाए जो कि हुआ, तो यह आसान है। यह रीबूट में काम नहीं करता है, लेकिन आपकी nohupसेटिंग्स के आधार पर यह एक शेल से बाहर निकलने / लॉगिंग के बाद भी चल सकता है।
पीटर कॉर्ड्स

4
ध्यान दें कि atजैसे ही सिस्टम निर्दिष्ट समय पर निलंबित हो जाता है, वैसे ही कमांड चलाता है, यहां देखें U & L - इसे चलाने के लिए कमांड (नों) के आधार पर आप जो चाहते हैं वह नहीं हो सकता है।
मिठाई

2
बस एक सुझाव, आप सीधे उस init.d स्क्रिप्ट को कॉल करने के बजाय सेवा की स्थिति की जांच करने के लिए systemctl का उपयोग कर सकते हैं। जबकि दोनों का एक ही परिणाम है, मुझे लगता है कि सिस्टेम सेवाओं के साथ बातचीत करने का आधुनिक तरीका पसंद किया जाना चाहिए:systemctl status atd
बाइट कमांडर

15

एक तरीका sudoअनुमतियों के साथ एक गोले के माध्यम से चलाने के लिए है (और जब आप शेल्स्क्रिप्ट शुरू करते हैं तो पासवर्ड दें), यदि शेल्स्क्रिप्ट वर्तमान निर्देशिका में है,

sudo ./delayer 4h

जहां delayerसामग्री के साथ एक गोले हो सकते हैं

#!/bin/bash
sleep "$1"
command

इसके साथ निष्पादन योग्य बनाएं

chmod +x delayer

और PATHयदि आप चाहें तो इसे एक निर्देशिका में कॉपी या स्थानांतरित कर सकते हैं।


यदि आप अधिक लचीली शेलस्क्रिप्ट चाहते हैं, जहां आप पैरामीटर (एस) दर्ज करके देरी करने के लिए कमांड [लाइन] का चयन कर सकते हैं, तो आप कोशिश कर सकते हैं

#!/bin/bash

if [ $# -lt 2 ] || [ "$(whoami)" != "root" ]
then
 echo "Delay start of command, that needs 'sudo'
Usage:    sudo $0 <delay> <command line>
Example:  sudo $0 4h parted -ls"
 exit
fi

sleep "$1"
shift
"$@"

डेमो उदाहरण (कम देरी, 5 एस, डेमो उद्देश्य के लिए),

$ ./delayer
Delay start of command, that needs 'sudo'
Usage:    sudo ./delayer <delay> <command line>
Example:  sudo ./delayer 4h parted -ls

$ sudo ./delayer 5s parted /dev/sdc p
[sudo] password for sudodus: 
Model: Kanguru SS3 (scsi)
Disk /dev/sdc: 15,9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 2      1049kB  2097kB  1049kB               primary  bios_grub
 3      2097kB  258MB   256MB   fat32        primary  boot, esp
 4      258MB   2274MB  2016MB               primary
 5      2274MB  12,5GB  10,2GB  ext2         primary
 1      12,5GB  15,9GB  3394MB  ntfs         primary  msftdata

3
ठीक है, अगर यह /bin/shवाक्यविन्यास है तो ठीक रहेगा। लेकिन यदि आप बैश-विशिष्ट सुविधाओं का उपयोग करने का इरादा रखते हैं, तो शेबंग आवश्यक है। मेरे और स्टीलड्राइवर के बारे में कहीं न कहीं चर्चा थी। इससे पहले कि मैं ठीक से जवाब दे पाऊं, और वीडियोनौथ ने अपनी टिप्पणी हटा दी। ओह अच्छी तरह से
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy, आप सही हैं। तो इस मामले में शेलबैंग अतिरिक्त सुविधाओं के मामले में शेलस्क्रिप्ट को मजबूत बनाने के लिए है जहां वाक्यविन्यास भिन्न हो सकता है।
सुडोडुस

@SergiyKolodyazhnyy खैर यह सिर्फ एक सुझाव था इसलिए मैंने सोचा कि टिप्पणी को छोड़ना आवश्यक नहीं है और केवल अव्यवस्था में जोड़ देगा। बेझिझक मुझे चैट में मारा और अपना विचार
बताइए

2

दूसरा तरीका यह होगा कि आप सूडो इंटरेक्टिव सेशन को शुरू करें sudo -s(निर्देशिका को नहीं बदलता) या sudo -i(वर्तमान निर्देशिका को रूट होम निर्देशिका में बदलता है) और फिर अपनी आज्ञाओं को दर्ज करें (बिना सूडो के)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.