Pythondan qobiq skriptini ruxsatnomalar bilan boshqaring

I have the most simple script called update.sh

#!/bin/sh
cd /home/pi/circulation_of_circuits
git pull

Men buni ./ update.sh bilan terminaldan chaqirganimda, Yuqori yangilangan bo'lsin yoki kutilgan fayllarni yangilaydi.

Bundan tashqari, python skripti bor, shu chipta ichida:

subprocess.call (['./ update.sh'])

Men shu skriptni chaqirganimda quyidagilarga erishaman:

Ruxsat rad qilindi (ochiq kalit).   o'lik: masofaviy ombordan o'qib bo'lmadi.

     

Iltimos, to'g'ri kirish huquqlariga ega ekanligingizga ishonch hosil qiling   va ombor mavjud.

(Men SSHdan foydalanaman).

----------------- yangilash --------------------

Kimdir menga qo'ng'iroq qildi:

OK, shuning uchun ba'zi harakat. Tasvirni ochsam, gitni tortib ololmayman   repo katalogingiz va bosh skript ham bajarilmaydi. Ko'rinayaptiki   chunki bukitka ombori xususiy va autentifikatsiya qilish kerak   tortish uchun (men foydalanadigan men jamoatchilik edi, shuning uchun menda yo'q edi   masalalar). Ehtimol, gitni birinchi marta yozganingizdan keyin buni eslab qoladi   vaqti-vaqti bilan, ba'zida qanday qilib fokuslar yozilayotgandek tuyuladi   keyinroq buyruq, lekin pitondan ishlasa ham bir xil emas.

     

Men git mutaxassisi emasman, lekin bunga yo'l qo'yishning bir yo'li kerak   piton autentifikatsiyani ta'minlaydi.

14
Ehtimol, cmd = ["sudo", "-u", "foydalanuvchi ismingiz", "boshingizdagi yo'l", "/home/pi/circulation_of_circuits/update.sh"] kabi narsalarni sinab ko'rishingiz mumkin. Bu yordam beradimi? Bu skriptni o'zingizning huquqlaringiz bilan sudo-ning o'rniga ishlatadi, chunki kennytmning fikricha, siz eslatma emas, balki rost qilishingiz kerak.
qo'shib qo'ydi muallif Montmons, manba
Yo'q, agar muhim bo'lsa, uni cmd = ['/home/pi/circulation_of_circuits/update.sh'] jarayoniga = subprocess.Popen (cmd, shell = rost, stdout = subprocess.PIPE) jarayoni deb nomladim. kuting()
qo'shib qo'ydi muallif clankill3r, manba
sudo chmod u + s c_of_c.py ni ishga tushirdim va skriptni sudo python c_of_c.py bilan ishlating, ammo bu yordam bermadi.
qo'shib qo'ydi muallif clankill3r, manba
@kennytm pi egasi.
qo'shib qo'ydi muallif clankill3r, manba
@Tzomas "E" ham yordam bermaydi. sudo-python -E c_of_c.py
qo'shib qo'ydi muallif clankill3r, manba
Buni ham sinab ko'rdim, masalan subprocess.call (['sudo', './update.sh']) , lekin bu narsa hech narsani o'zgartirmaydi.
qo'shib qo'ydi muallif clankill3r, manba
@zzn Python skriptini boshqa foydalanuvchilar bilan qanday ishlatishim mumkin?
qo'shib qo'ydi muallif clankill3r, manba
@kalaracey Ikkala skriptni ham ildiz sifatida ishlataman. Va shell = rost ham yordam bermadi.
qo'shib qo'ydi muallif clankill3r, manba
Agar kimdir mo''jizali bo'lsa, os.geteuid() 0 bo'lishi kerak, shuning uchun yaxshi bo'lishi kerak.
qo'shib qo'ydi muallif clankill3r, manba
@ clankill3r Repositoryni kim klonlashdi? root yoki boshqasi?
qo'shib qo'ydi muallif kennytm, manba
@ clankill3r Ushbu update.sh kodini pi deb ishlay olasizmi? Bundan tashqari, Python skriptini root py o'rniga ishlatish kerak?
qo'shib qo'ydi muallif kennytm, manba
@ clankill3r Yo'q, sudo haqida emas. Aslida root sifatida ishlamasligingiz kerak go pull . Savol quyidagicha: majburiy skriptni root sifatida ishlatishingiz kerak.
qo'shib qo'ydi muallif kennytm, manba
0 qaytarilsa u ildiz sifatida ishlayotganligini o'ylaydi. Python skriptini root sifatida ishlatasizmi? Agar shunday bo'lsa, mening original javobim qo'llaniladi.
qo'shib qo'ydi muallif kalaracey, manba
Bu sizning muammoingizni hal qiladimi? ( shell = true bayrog'ini o'tish): stackoverflow.com/a/325474/608259
qo'shib qo'ydi muallif kalaracey, manba
@ Clankill3r javobini qabul qila olasizmi?
qo'shib qo'ydi muallif jimh, manba
Skriptni sudo bilan bajarasizmi?
qo'shib qo'ydi muallif Tzomas, manba
Python skriptini -E variantini ishlatishga harakat qiling
qo'shib qo'ydi muallif Tzomas, manba
Ruxsat rad qilindi (ochiq kalit). , ssh config bilan bog'liq muammolar borligini, turli foydalanuvchilar bilan python buyruq faylini ishlatishini ko'rsatib turibdi?
qo'shib qo'ydi muallif zzn, manba

9 javoblar

ssh buyrug'ingizni, ehtimol, unga kirishingiz mumkin bo'lgan jamoat yoki xususiy kalitni berishingiz kerak bo'lgan kabi:

ssh -i /backup/home/user/.ssh/id_dsa [email protected]

Keyin qaerni izlash kerakligini aytadi

11
qo'shib qo'ydi

Bu muammo git repo autentifikatsiyasining bajarilmasligi tufayli yuzaga keladi. Siz SSHdan foydalanmoqdasiz, va git allaqanday buzilganligi haqida shikoyat qilmoqda. Odatda, o'tish buyruqlaridan parol kiritmasdan maxsus repo-da foydalanishingiz mumkin. Bularning barchasi, gitning ssh-ni ishlatishini anglatadi, ammo oxirgi holatda u to'g'ri kalitni topa olmaydi.

Muammo faqat boshqa skript orqali bajarilganda o'zini namoyon qilgandan buyon, atrof muhit o'zgaruvchilari bilan aralashuvga sabab bo'ladi. Subprocess.call atrof-muhit kabi o'tishi kerak, shuning uchun odatiy gumon qilingan bir juft bor:

  1. sudo.
    • if you are using sudo, it will pass a mostly empty environment to the process
  2. the python script itself
    • if the python script changes its env, those changes will get propagated to the subprocess too.
  3. sh -lor su -
    • these commands set up a login shell, which means their environment gets reset to defaults.

Ushbu sabablarning har biri ssh-agent (yoki ba'zi bir boshqa kalitlarni boshqarish vositasi) ishlaydigan muhit o'zgaruvchilarini yashirishi mumkin.

Tashxis va tuzatishga qaratilgan qadamlar:

  1. Isolate the problem.

    • Create a minimal python script that does nothing else than runs subprocess.call(['./update.sh']). Run both update.sh and the new script.
  2. Diagnose the problem and fix accordingly:

    a) If update.sh works, and the new script doesn't, you are probably experiencing some weird corner case of system misconfiguration. Try upgrading your system and python; if the problem persists, it probably requires additional debugging on the affected system itself.

    b) If both update.sh and the new script work, then the problem lies within the outer python script calling the shell script. Look for occurrences of sudo, su -, sh -l, env and os.environ, one of those is the most likely culprit.

    c) If neither the update.sh nor the new script work, your problem is likely to be with ssh client configuration; a typical cause would be that you are using a non-default identity, did not configure it in ~/.ssh/config but used ssh-add instead, and after that, ssh-agent's cache expired. In this case, run ssh-add identityfile for the identity you used to authenticate to that git repo, and try again.

5
qo'shib qo'ydi

Sizning versiyani boshqarish tizimi kabi pull uchun autentifikatsiya qilish kerak, shuning uchun pitonni pexpect ,

import pexpect
child = pexpect.spawn('./update.sh')
child.expect('Password:')
child.sendline('SuperSecretPassword')
3
qo'shib qo'ydi

I believe this answer will help you: https://serverfault.com/questions/497217/automate-git-pull-stuck-with-keychain?answertab=votes#tab-top

I didn't use ssh-agent and it worked: Change your script to the one that follows and try.

#!/bin/bash
cd /home/pi/circulation_of_circuits 
ssh-add /home/yourHomefolderName/.ssh/id_rsa
ssh-add -l
git pull

Bu sizning ssh kalitingizni to'g'ri tuzilgan deb taxmin qiladi.

3
qo'shib qo'ydi

Subprocess chaqiriqlaridan foydalanish o'rniga sh to'plamidan foydalaning. https://pypi.python.org/pypi/sh Ushbu snippetani sinab ko'rdim va u men uchun ishladi.

#!/usr/local/bin/python

import sh

sh.cd("/Users/siyer/workspace/scripts")
print sh.git("pull")

Chiqish:

Zotanoq yangilangan.

2
qo'shib qo'ydi
import subprocess 

subprocess.call("sh update.sh", shell=True)
2
qo'shib qo'ydi
Qo'shimcha ma'lumotni kiritish uchun javobingizni tahrirlashingiz mumkin.
qo'shib qo'ydi muallif Donald Duck, manba
Ushbu kod savolga javob berishi mumkin, ammo bu kod nima uchun va/yoki qanday javob berishiga oid qo'shimcha kontekstni taqdim etadi, uning uzoq muddatli qiymatini oshiradi.
qo'shib qo'ydi muallif Donald Duck, manba
"sh update.sh" ni qo'shdik, chunki biz shell skriptini ikkita shaklda bajarishimiz mumkin: i) 1) ./update.sh va 2) sh update.sh, bu erda ham ishlash kerak. ammo uning uchun 1 kishi ishlaydi, shuning uchun men uni 2 kishini sinashni taklif qildim. rahmat
qo'shib qo'ydi muallif Kanagaraj Dhanapal, manba

I can reproduce your fault. It has nothing to do with permission, it depends how your ssh are installed on your system. To verify it's the same cause i need the diff output.

Quyidagilarni faylga log_shell_env.sh yozib oling,

#!/bin/bash

log="shell_env"$1
echo "create shell_env"$1

echo "shell_env" > $log

echo "whoami="$(whoami) >> $log
echo "which git="$(which git) >> $log
echo "git status="$(git status 2>&1) >> $log
echo "git pull="$(git pull 2>&1) >> $log
echo "ssh -vT [email protected]="$(ssh -T [email protected] 2>&1) >> $log

echo "ssh -V="$(ssh -V 2>&1) >> $log
echo "ls -al ~/.ssh="$(ls -a ~/.ssh) >> $log

echo "which ssh-askpass="$(which ssh-askpass) >> $log
echo "ps -e | grep [s]sh-agent="$(ps -e | grep [s]sh-agent ) >> $log
echo "ssh-add -l="$(ssh-add -l) >> $log

echo "set=" >> $log
set  >> $log

set execute permission and run it twice:
1. From the console without parameter
2. From your python script with parameter '.python'
Please, run it realy from the same python script!

   For instance:
    try:
        output= subprocess.check_output(['./log_shell_env.sh', '.python'], stderr=subprocess.STDOUT)
        print(output.decode('utf-8'))

    except subprocess.CalledProcessError as cpe:
        print('[ERROR] check_output: %s' % cpe)

Do a diff shell_env shell_env.python > shell_env.diff The resulting shell_env.diff should show not more than the following diffs:

15,16c15,16  
< BASH_ARGC=()
< BASH_ARGV=()
---
> BASH_ARGC=([0]="1")
> BASH_ARGV=([0]=".python")
48c48
< PPID=2209
---
> PPID=2220
72c72
< log=shell_env
---
> log=shell_env.python

ko'proq farq> bo'lsin savollaringiz bilan diff chiqishi bilan yangilang.

1
qo'shib qo'ydi

Quyidagi python kodidan foydalaning. Bu pythonda os modulini import qiladi va sudo ruxsatnomalari bilan tizimga qo'ng'iroq qiladi.

#!/bin/python
import os 
os.system("sudo ./update.sh")
1
qo'shib qo'ydi
Agar root bo'lmagan foydalanuvchi foydalanmoqchi bo'lsalar, nima bo'ladi? Yoki parolni kiritmasdan buni qilishni xohlaydilarmi?
qo'shib qo'ydi muallif tahsmith, manba
Agar foydalanuvchi ildiz bo'lmasa, u holda hech bo'lmaganda sudo guruhining a'zosi bo'lishi kerak. Shell skript ham sudo guruh uchun bajariladigan ruxsatlarga ega bo'lishi kerak, aks holda sudo bash update.sh kifoya qiladi. Parolni kiritmasdan buni qilish yo'llari bor, lekin ular talabga javob va men unga qarshi maslahat beraman.
qo'shib qo'ydi muallif Alexander Collins, manba

Git 1.7.9 yoki undan keyingi versiyalarda siz quyidagi hisobga olish yordamchidan foydalanishingiz mumkin:

Vaqt tugashi bilan

git config --global credential.helper cache

... Gitga parolingizni kesh xotirasida saqlab qolish uchun 15 daqiqada ogohlantirish kerak. Siz bilan ko'proq vaqt tugashi mumkin:

git config --global credential.helper "cache --timeout=3600"

(Ushbu misol, GitHub yordamida tavsiya etilgan Linux uchun sahifa ). Agar siz xohlagan bo'lsangiz, hisob qaydnomangizni doimiy ravishda saqlashingiz mumkin.

muddatini tejash

git-hisob ma'lumotlari-do'konidan foydalanishingiz mumkin.

git config credential.helper store

GitHub's help also suggests that if you're on Mac OS X and used Homebrew to install Git, you can use the native Mac OS X keystore with:

git config --global credential.helper osxkeychain

Windows uchun Windows uchun Git Credential Manager deb nomlangan yordamchi yoki msysgitda wincred mavjud.

git config --global credential.helper wincred # obsolete

Git uchun Windows 2.7.3+ (mart 2016):

git config --global credential.helper manager

Linux uchun, gnome-keyring (yoki KWallet kabi boshqa keyring dasturini) dan foydalanishingiz mumkin.

Va nihoyat, taklif etilgan buyruqlar birini qo'lda bajarganingizdan so'ng, siz skriptingizni o'zgarishsiz bajarishingiz mumkin.

1
qo'shib qo'ydi
@ clankill3r siz taklif qilgan narsani sinab ko'rdingizmi? Savolingiz yaxshi hujjatlangan bo'lsa, barchamiz uchun foydali bo'ladi
qo'shib qo'ydi muallif sdikby, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming