Score:1

เรียกใช้ Bash Script เป็นรูทด้วยส่วนสคริปต์ที่ไม่ใช่รูท

ธง gh

ฉันมีสคริปต์ทุบตีที่ต้องเรียกใช้ในฐานะรูทเพื่อทำงานให้สำเร็จ ในกรณีนี้คือการทำให้ตัวตรวจสอบความถูกต้องถ่ายภาพสแน็ปช็อตของ Helium blockchain

ฉันได้แก้ไขไฟล์ /etc/sudoers เพื่อให้ฉันเรียกใช้สคริปต์นี้ในฐานะรูทได้ มันใช้งานได้ดี

useraccount ALL=(ALL:ALL) NOPASSWD:/home/useraccount/validator_data/snapshotmaker.sh

คำสั่งในสคริปต์มีดังนี้:

sudo docker exec ภาพรวมของเครื่องมือตรวจสอบผู้ตรวจสอบ ใช้ /var/data/$dtt

หลังจากนี้ คำสั่งสร้างไฟล์แบบนี้ '30-10-2021T233752.bin'.

ขั้นตอนต่อไปของฉันคือนำไฟล์นี้และคัดลอกไปยัง IPFS เพื่อให้ฉันแชร์ได้ คำสั่งให้ทำคือ:

ipfs ไฟล์ cp /ipfs/$(ipfs เพิ่ม -Q $localfile) $ip

ในขณะนี้ ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: ไม่พบที่เก็บ IPFS ใน /root/.ipfs โปรดเรียกใช้: 'ipfs init'

นี่เป็นเพราะมันพยายามเรียกใช้ในฐานะรูทเมื่อการกำหนดค่าอยู่ในบัญชีผู้ใช้ของฉัน

ฉันพยายามสลับบัญชีระหว่างสคริปต์ แต่ดูเหมือนว่าจะหยุดทำงาน

ดังนั้นคำถามของฉันคือวิธีเรียกใช้คำสั่ง IPFS ในฐานะผู้ใช้ดั้งเดิมของฉันจากภายในสคริปต์รูท

สคริปต์ทุบตีของฉัน:

#!/bin/bash

dt=$(วันที่ '+%d-%m-%YT%H%M%S');
dtt="${dt}.bin"
a='/var/data/'
c="${a}${dt}.bin"

เสียงสะท้อน "${c}"

sudo docker exec ภาพรวมของเครื่องมือตรวจสอบผู้ตรวจสอบ ใช้ /var/data/$dtt


localfile="/home/useraccount/validator_data/${dt}.bin"
echo "LocalFile: ${localfile}"

ip=" /Helium/Snapshots/2021/${dt}.bin"
echo "ตำแหน่ง IPFS: ${ip}"

นอน2

ถ้า [ -f "$localfile" ]; แล้ว
        echo "$localfile มีอยู่"
        sudo chown useraccount $localfile
        ฉันเป็นใคร
        su - บัญชีผู้ใช้
        ฉันเป็นใคร
        ipfs ไฟล์ cp /ipfs/$(ipfs เพิ่ม -Q $localfile) $ip
        #ipfs ไฟล์ cp /ipfs/$(ipfs เพิ่ม -Q <local-file>) "/Helium/Snapshots/2021/<dest-name>"
อื่น 
    echo "ไม่มี $localfile"
ไฟ

ผลลัพธ์จะเป็นดังนี้:

/var/data/31-10-2021T005728.bin
ตกลง
LocalFile: /home/useraccount/validator_data/31-10-2021T005728.bin
ตำแหน่ง IPFS: /Helium/Snapshots/2021/31-10-2021T005728.bin
/home/useraccount/validator_data/31-10-2021T005728.bin อยู่
ราก

แล้วมันก็ตาย ถ้าฉันเอา สุ บรรทัด จากนั้นฉันได้รับปัญหารูตตามที่กล่าวไว้ที่ด้านบนของโพสต์นี้

หวังว่าจะมีคนช่วยได้

sudodus avatar
jp flag
คุณเรียกใช้สคริปต์นี้ด้วยตนเองหรือโดยอัตโนมัติ (เช่น ผ่าน `cron`) - อย่าเรียกใช้สคริปต์ทั้งหมดในฐานะรูท แทนที่จะเรียกใช้ในฐานะผู้ใช้ปกติของคุณ จากนั้น เมื่อถึงคำสั่งที่ต้องได้รับการอนุญาตขั้นสูง คุณเรียกคำสั่งเหล่านั้นด้วย sudo แล้ว และคุณจะได้รับแจ้งให้ป้อนรหัสผ่าน แต่ **คุณสามารถสร้าง 'เฉพาะ' งาน sudo ที่จำเป็นให้ทำงานได้โดยไม่ต้องใช้รหัสผ่าน**: แก้ไข `/etc/sudoers` ผ่าน `visudo`
DevilCode avatar
gh flag
ฉันกำลังทำงานด้วยตนเองในขณะนี้ แต่จะ cron เมื่อทุกอย่างทำงาน คุณกำลังบอกว่าฉันควรเพิ่มเฉพาะคำสั่ง sudo docker ให้กับ sudoers แทนที่จะเป็น bash script หรือไม่
bac0n avatar
cn flag
@sudodus ฉันจะพูดตรงกันข้าม เช่น ในกรณีนี้ จะให้ผู้ใช้เข้าถึง `chown' เหมือนแจกกุญแจ ตราบใดที่สคริปต์มีงานที่กำหนดไว้อย่างดี `sudo` ก็ไม่น่าจะมีปัญหา
bac0n avatar
cn flag
มีช่องว่างบน `ip=" /Helium..."`
bac0n avatar
cn flag
@DevilCode ฉันขอแนะนำให้คุณลบ sudo ทั้งหมดออกจากสคริปต์ และเรียกใช้สคริปต์ด้วย sudo และใช้ su กับ ipfs: `su -c 'ไฟล์ ipfs cp /ipfs/$(ipfs เพิ่ม -Q $1) $2' _ "$localfile" "$ip"`
sudodus avatar
jp flag
@bac0n ฉันยอมรับว่าคุณไม่ควรให้สิทธิ์การเข้าถึงทั่วไปแก่ chown แต่เฉพาะกับบรรทัดคำสั่งเฉพาะที่สคริปต์ใช้ ถ้าผมจำไม่ผิด เป็นไปได้ และควรทำให้ปลอดภัย - มิฉะนั้น เมื่อเข้าถึง shellscript ทั้งหมด คุณควรดัก ctrl C เพื่อลดความเสี่ยงของการละเมิด นี่จะเป็นทางออกที่ดีเช่นกัน
sudodus avatar
jp flag
@DevilCode ใช่ นั่นคือสิ่งที่ฉันแนะนำ **ทั้งบรรทัดคำสั่ง** ด้วย `sudo docker ...` และ `sudo chown useraccount $localfile`
DevilCode avatar
gh flag
มีคนจะต้องเขียนสิ่งนี้ออกมาเพราะตอนนี้ฉันหลงทาง @bac0n คำสั่งนั้นทำงานอย่างไร ฉันคิดว่า $1 $2 เป็นข้อโต้แย้งของสคริปต์ ?
bac0n avatar
cn flag
`su -c` ทำงานในลักษณะเดียวกับ `sh -c` โดยที่ `-c` รับอาร์กิวเมนต์แรกเป็น 'command string' และอาร์กิวเมนต์ต่อไปนี้จะกลายเป็นพารามิเตอร์ระบุตำแหน่งภายในสตริงคำสั่ง เช่น `su user -c ' echo $0 $1 $2' _ หนึ่ง สอง`
DevilCode avatar
gh flag
ใช้งานไม่ได้อย่างน่าเสียดาย ฉันลอง sudo su useraccount -c '/usr/local/bin/ipfs stats repo' ไม่สามารถใช้งานได้โดยมีหรือไม่มี sudo มันใช้ได้เหมือนสคริปต์ แต่เมื่อรันผ่าน crontab มันจะล้มเหลว crontab ต้องทำอะไรแปลกๆ ถ้าฉันเพิ่งเรียกคำสั่งโดยตรงจาก repo สถิติ scrip /usr/local/bin/ipfs สิ่งนี้ใช้ได้ ถ้าฉันทำด้วยคำสั่งไฟล์มันไม่ได้ ไม่มีความคิดอื่นใดนอกจากมันกำลังทำงานในสถานที่แปลก ๆ หรืออะไรบางอย่าง
Score:1
ธง jp

ฉันทำการทดสอบ 'dry run' โดยไม่มี นักเทียบท่า และสิ่งที่คุณทำในนั้นและนอกนั้น ไอพีเอส. วิธีการ ควร ทำงานให้คุณด้วยโปรแกรมจริงหลังจากการปรับแต่งบางอย่าง

  • เรียกใช้เชลล์สคริปต์ สคริปต์ ในฐานะผู้ใช้ปกติของคุณ ไม่ใช่กับ ซูโด.

  • แก้ไขสคริปต์เพื่อเปลี่ยนจาก 'ผู้ทดสอบ' ในการสาธิตของฉันเป็นชื่อผู้ใช้ของคุณ

  • แก้ไขบรรทัดคำสั่งที่ต้องการ ซูโด โดยไม่มีรหัสผ่านด้วย visudo,

    $ LANG =C sudo tail -n2 /etc/sudoers
    %tester ALL=NOPASSWD: /usr/sbin/docker exec ตรวจสอบสแน็ปช็อตของผู้ขุดใช้ /var/data/tmpfil
    %ผู้ทดสอบทั้งหมด=NOPASSWD: /usr/bin/chown ผู้ทดสอบ /home/tester/validator_data/tmpfil
    
    • สิ่งสำคัญคือต้องมีชื่อที่แน่นอนของไฟล์สำหรับการดำเนินการ sudo หลังจากนั้นสามารถตั้งชื่อได้ขึ้นอยู่กับเวลา
    • ตรวจสอบตำแหน่งของไฟล์ปฏิบัติการนักเทียบท่า (อาจไม่อยู่ใน /usr/sbin).

สคริปต์ที่แก้ไขของฉัน สคริปต์:

#!/bin/bash

ถ้า [ "$(whoami)" != "ผู้ทดสอบ" ]
แล้ว
 echo "เรียกใช้ในฐานะ 'ผู้ทดสอบ'"
 ทางออก
ไฟ

dt=$(วันที่ '+%d-%m-%YT%H%M%S');
dtt="${dt}.bin"
a='/var/data/'
c="${a}${dt}.bin"

เสียงสะท้อน "${c}"

sudo /usr/sbin/docker exec ตัวตรวจสอบความถูกต้องของสแน็ปช็อต miner ใช้ /var/data/tmpfil

ถ้า [ -f "/home/tester/validator_data/tmpfil" ]; แล้ว
        ls -l "/home/tester/validator_data/tmpfil"

        sudo /usr/bin/chown เครื่องทดสอบ "/home/tester/validator_data/tmpfil"
        mv "/home/tester/validator_data/tmpfil" "/home/tester/validator_data/${dt}.bin"
        localfile="/home/tester/validator_data/${dt}.bin"
        echo "LocalFile: ${localfile}"
        ls -l "${localfile}"

        ip=" /Helium/Snapshots/2021/${dt}.bin"
        echo "ตำแหน่ง IPFS: ${ip}"

        นอน2

        echo "$localfile มีอยู่"
        ฉันเป็นใคร
        /usr/local/bin/ipfs ไฟล์ cp /ipfs/$(/usr/local/bin/ipfs เพิ่ม -Q $localfile) $ip
        #ipfs ไฟล์ cp /ipfs/$(ipfs เพิ่ม -Q <local-file>) "/Helium/Snapshots/2021/<dest-name>"
อื่น 
    echo "ไม่มี $localfile"
ไฟ

สคริปต์ที่อ้างว่าเป็น นักเทียบท่า บรรทัดคำสั่ง:

#!/bin/bash

ถ้า [ "$EUID" == "0" ]
แล้ว
 echo "โลกของนักเทียบท่า" > "/home/tester/validator_data/tmpfil"
 chown root:root "/home/tester/validator_data/tmpfil"
 ก้อง "ตกลง"
อื่น
 echo "รันด้วย sudo"
ไฟ

เรียกใช้การสาธิต:

tester@lenovo-v130:~$ LANG=C ./scrip 
/var/data/01-11-2021T051748.bin
ตกลง
-rw-r--r-- 1 รูทรูท 15 พ.ย. 1 05:17 /home/tester/validator_data/tmpfil
LocalFile: /home/tester/validator_data/01-11-2021T051748.bin
-rw-r--r-- 1 ผู้ทดสอบรูท 15 พ.ย. 1 05:17 /home/tester/validator_data/01-11-2021T051748.bin
ตำแหน่ง IPFS: /Helium/Snapshots/2021/01-11-2021T051748.bin
/home/tester/validator_data/01-11-2021T051748.bin มีอยู่
ผู้ทดสอบ
./scrip: บรรทัดที่ 34: ipfs: ไม่พบคำสั่ง
./scrip: บรรทัดที่ 34: ipfs: ไม่พบคำสั่ง
DevilCode avatar
gh flag
ตกลงดังนั้นฉันจึงเปลี่ยนให้ทำงานตามที่คุณแนะนำ เมื่อเรียกผ่าน command line มันทำงานได้อย่างสมบูรณ์ เมื่อเรียกผ่าน crontab ทุกอย่างทำงานได้ยกเว้นบรรทัด cp ไฟล์ ipfs สำหรับบางเสียงเมื่อมีการเรียก ipfs บรรทัดนั้นจะไม่ทำงานเมื่อทำผ่าน crontab ฉันได้เพิ่มเส้นทางเต็ม /usr/local/bin/ipfs แล้วและไม่มีโชค
DevilCode avatar
gh flag
พบมัน: /usr/local/bin/ipfs ไฟล์ cp /ipfs/$(/usr/local/bin/ipfs add -Q
DevilCode avatar
gh flag
ขอบคุณทุกคน !!
sudodus avatar
jp flag
@DevilCode คุณทำให้มันใช้งานได้ :-) ฉันดีใจที่ได้ช่วยเหลือคุณระหว่างทาง
Score:0
ธง cn

ดังนั้นคำถามของฉันคือวิธีเรียกใช้คำสั่ง IPFS ในฐานะผู้ใช้ดั้งเดิมของฉันจากภายในสคริปต์รูท

sudo su - useraccount -c คำสั่ง
Score:0
ธง cn

ขั้นแรก คุณต้องสร้างการกำหนดค่า sudo สำหรับสคริปต์ของคุณ ในตัวอย่างนี้ เราใส่ไว้ /etc/sudoers.d โดยได้รับอนุญาต 440:

Cmnd_Alias ​​CMDS = /opt/bin/docker_example.sh
User_Alias ​​CMDUSERS = bac0n
CMDUSERS ALL=(ทั้งหมด) NOPASSWD: CMDS
ค่าเริ่มต้น !CMDS !requiretty

เราตั้งชื่อสคริปต์ นักเทียบท่า_example.shดังที่แสดงในตัวอย่าง sudo:

#!/bin/bash

# ออกทันทีเมื่อสถานะการออกไม่เป็นศูนย์
ตั้ง -e

((EUID != 0)) && {
    echo สคริปต์นี้ควรทำงานในฐานะรูท
    ทางออก 1
}

[[ ${SUDO_USER+ } ]] && \
user_account=$SUDO_USER || user_account=$(id -nu)

printf -v bin_file \
'%(%d-%m-%YT%H%M%S)T.%s' -1 ถัง

local_file=$HOME/validator_data/$bin_file
 ipfs_file=/Helium/Snapshots/2021/$bin_file

พิมพ์ฟ '
ไฟล์ถังขยะ: %s
ไฟล์ในเครื่อง: %s
ไฟล์ IPFS: %s
' "$bin_file" "$local_file" "$ipfs_file"

นักเทียบท่า exec ตรวจสอบภาพรวมของนักขุดใช้ "/var/data/$bin_file"
นอน2

[[ -f $local_file ]] || {
    ไม่มีไฟล์ echo: "$local_file"
    ทางออก 1
}

chown $user_account "$local_file"

#
# su $user_account -c 'echo whoami: $1, su: $(id -nu)' _ $(id -nu)
#
su $user_account -c 'ipfs files cp "/ipfs/$(ipfs add -Q "$1")" "$2"' _ "$local_file" "$ipfs_file"

ตอนนี้คุณควรจะสามารถเพิ่มสคริปต์นี้ด้วย sudo ไปยัง crontab และควรรันด้วย NOPASSWD

$ sudo crontab -u bac0n -e
# คำสั่ง min hour dom month dow
* * * * * sudo /opt/bin/docker_example.sh > /dev/null 2>&1

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา