কীভাবে আমি একটি এসডিএল অ্যাপকে (রুট হিসাবে চলমান নয়) কনসোলটি ব্যবহার করতে দেব let


14

কনসোল থেকে গ্রাফিক্স প্রদর্শন করতে, কনসোল থেকে লগইন না করে এবং প্রোগ্রামটিকে মূল হিসাবে চালিত না করেই আমি এসডিএল-ভিত্তিক প্রোগ্রামটি ব্যবহার করতে চাই। উদাহরণস্বরূপ, আমি এটি ssh এর মাধ্যমে চালাতে সক্ষম হতে চাই। লক্ষ্যযুক্ত ওএস হ'ল রাস্পিয়ান।

সমস্যাটি বর্ণনা করার জন্য এখানে অজগরটির একটি সংক্ষিপ্ত উদাহরণ দেওয়া হল:

import os, pygame
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
pygame.init()
s = pygame.display.set_mode()
print "Success"

এটি কাজ করে (সমাপ্তির দিকে চালিত হয়, ব্যতিক্রম ছুঁড়ে না) আমি যদি এটি কনসোল থেকে চালনা করি এবং আমি এটির মূল হিসাবে চালিত করি তবে এটি ssh এর মাধ্যমে কাজ করে।

আমি দেখেছি যে আমার ব্যবহারকারীর অডিও এবং ভিডিও গ্রুপ রয়েছে।

এটি কনসোল থেকে চালানো (যা কাজ করে), এটি ssh এর মাধ্যমে রুট হিসাবে চালানো (এটিও কাজ করে) এবং এসএসএসের মাধ্যমে এটি নিয়মিত ব্যবহারকারীর হিসাবে চালানোর (কোনও কাজ করে না) মধ্যে কী আলাদা তা দেখার জন্য আমি স্ট্রেস ব্যবহার করেছি।

প্রথম পার্থক্যটি হ'ল আমার ব্যবহারকারীর / dev / tty0 অ্যাক্সেস করার অনুমতি নেই। আমি একটি নতুন গোষ্ঠী তৈরি করেছি (tty0), আমার ব্যবহারকারীকে সেই গোষ্ঠীতে রেখেছি এবং সেই গোষ্ঠীকে / dev / tty0 এ অ্যাক্সেস দেওয়ার জন্য একটি udev নিয়ম যুক্ত করেছি।

স্ট্রেস আউটপুট এই ioctl কলটিতে ডাইভারেজ করে - ব্যর্থতা এখানে প্রদর্শিত হয়; প্রোগ্রামটি যখন কনসোল থেকে চালিত হয় বা এসএসএস থেকে মূল হিসাবে চালিত হয় তখন আইওসিটিএল 0 প্রদান করে:

open("/dev/tty", O_RDWR)                = 4
ioctl(4, VT_GETSTATE, 0xbeaa01f8)       = -1 EINVAL (Invalid argument)

(ঠিকানাগুলিও পৃথক, তবে এটি গুরুত্বপূর্ণ নয়))

আমার প্রোগ্রামটি যখন এটি রুট হিসাবে চালিত হয় কাজ করে তা দেওয়া, আমি মনে করি এর অর্থ আমার অনুমতি সংক্রান্ত সমস্যা আছে। কনসোলে লগইন না করে (এবং রুট হিসাবে চালিত না হয়ে) এই প্রোগ্রামটি চালাতে সক্ষম হওয়ার জন্য আমি কীভাবে আমার ব্যবহারকারীকে প্রয়োজনীয় অনুমতিগুলি দেব?


আপনার ফ্রেমবফার ডিভাইসে মালিকানা / অনুমতিগুলি কী কী?
বান্দ্রমি

এছাড়াও / dev / tty সাধারণত লিখতে কনসোল গ্রুপে সদস্যতা প্রয়োজন।
বান্দ্রমি

ajclarkson.co.uk/blog/pygame-no-root দেখতে একটি সমাধানের মতো দেখাচ্ছে।
আর্থার 2e5

উত্তর:


3

আমার লক্ষ্যটি মূল পোস্টারের মতো একই, তবে একটি পার্থক্যের সাথে: আমাকে সিস্টেমড ডেমন হিসাবে এসডিএল অ্যাপ্লিকেশন চালানো দরকার। আমার লিনাক্স মেশিনটি রাস্পবেরি পাই 3 এবং অপারেটিং সিস্টেমটি রাস্পবিয়ান জেসি। আরপিআই-তে কোনও কিবোর্ড বা মাউস সংযুক্ত নেই। আমি এসএসএইচ ব্যবহার করে এটিতে সংযুক্ত হয়েছি। আমার এসডিএল অ্যাপটি আসলে একটি পাইগাম- ভিত্তিক অ্যাপ। আমি পিডিগেম / এসডিএলকে এসডিএল_ভিডিওড্রাইভার এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে "fbcon" ফ্রেমবফার ড্রাইভারটি ব্যবহার করার জন্য সেট করেছি। আমার systemd --versionফলাফল:

সিস্টেমযুক্ত 215 + প্যাম + অডিট + সেলিং + আইএমএ

আমার পাইগাম প্যাকেজ সংস্করণটি হ'ল: ( aptitude show python-pygame):

1.9.2 ~ প্রাক ~ r3348-2 ~ bpo8 + + rpi1

আমার libSDL 1.2 সংস্করণটি হল: ( aptitude show libsdl1.2debian- আপনার মেশিনের প্যাকেজের নাম আলাদা হতে পারে):

1.2.15-10 + + rpi1

প্রস্তুতপ্রণালী

  1. ইউডুডের উত্তরে বর্ণিত হিসাবে / dev / tty এবং / dev / fb0 ফাইলগুলির জন্য অনুমতি সেট আপ করুন। আমি আবিষ্কার করেছি যে রাস্পবিয়ান জেসিতে / dev / কনসোলের অনুমতি পরিবর্তনগুলি প্রয়োজনীয় নয়।
  2. আপনার ডেমনের। পরিষেবা ফাইলের [পরিষেবা] বিভাগে এই লাইনগুলি যুক্ত করুন:

    User=pi #Your limited user name goes here
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2   # I also tried /dev/tty1 and that didn't work for me
    

    যদি কেউ আগ্রহী হন তবে আমি এখানে ব্যবহৃত সম্পূর্ণ পাইসকোফবি.সার্ভিস ফাইলটি:

    [Unit]
    Description=Pyscopefb test service 
    Wants=network-online.target
    After=rsyslog.service
    After=network-online.target
    
    [Service]
    Restart=no
    ExecStart=/home/pi/Soft/Test/pygame/pyscopefb
    ExecStop=/bin/kill -INT $MAINPID
    OOMScoreAdjust=-100
    TimeoutStopSec=10s
    User=pi
    WorkingDirectory=/home/pi/Soft/Test/pygame
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2
    
    [Install]
    WantedBy=multi-user.target
    
  3. কমান্ড প্রম্পটে এই কমান্ডগুলি ইস্যু করুন (আমি ধরে নিলাম পাইসকোফবি.সার্ভিস ফাইলটি ইতিমধ্যে সঠিক জায়গায় স্থাপন করা হয়েছে যেখানে সিস্টেমড এটি সন্ধান করতে পারে):

    sudo systemctl daemon-reload
    sudo systemctl start pyscopefb
    

এটা আমার জন্য কাজ করছে। দয়া করে নোট করুন আমি পাইগাম অ্যাপ্লিকেশন কীবোর্ড এবং মাউস ইভেন্টগুলি গ্রহণ করতে সক্ষম কিনা তা পরীক্ষা করিনি।

বোনাস

আমাকে আরও 2 টি সমস্যা সমাধান করতে হয়েছিল যা আগ্রহীও হতে পারে

  1. ফ্রেমবফার গ্রাফিক্স সহ পর্দার নীচে জ্বলজ্বলে পাঠ্য কার্সার ছিল। এটি সমাধান করার জন্য, আমি আমার অ্যাপ্লিকেশনটিতে নিম্নলিখিত পাইথন কোডটি যুক্ত করেছি যা পাইগাম / এসডিএল সূচনা করার আগে আমার অ্যাপে চলে:

    def _disable_text_cursor_blinking(self):
        command_to_run = ["/usr/bin/sudo", "sh", "-c", "echo 0 > /sys/class/graphics/fbcon/cursor_blink"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_text_cursor_blinking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_text_cursor_blinking failed!")
            raise
    
  2. প্রায় 10 মিনিটের পরে রাস্পবেরি পাই এর এইচডিএমআই আউটপুটটি কালো হয়ে গেছে (তবে চালিত হয়নি) এবং আমার গ্রাফিকগুলি প্রদর্শিত হয়নি, যদিও পাইগামে কোনও ত্রুটি নেই। এটি একটি পাওয়ার সাশ্রয় বৈশিষ্ট্য হিসাবে দেখা গেছে। এটি অক্ষম করতে, আমি নিম্নলিখিত পাইথন কোডটি যুক্ত করেছি যা পাইগামে / এসডিএল সূচনার আগেও চলে:

    def _disable_screen_blanking(self):
        command_to_run = ["/usr/bin/setterm", "--blank", "0"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_screen_blanking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_screen_blanking failed!")
            raise
    

1
আমার পাইয়ের সাথে কোনও কীবোর্ড যুক্ত না করে পাইগেম শুরু করতে এটি আমার পক্ষে অত্যন্ত সহায়ক ছিল, তাই আপনাকে ধন্যবাদ! আমি উল্লেখ করতে চেয়েছিলাম যে আমি পাইগেম চালানো /dev/tty7এবং ExecStartPre=/bin/chvt 7কার্সার জিনিসটি এড়াতে একটি ইস্যু করার পক্ষে যথেষ্ট সহজ পেয়েছি এবং এটিতে টাইটি 1 – tty6 এ ডিফল্টরূপে চালিত অ্যাজেটির সাথে সংঘর্ষ না করার বোনাস রয়েছে runs
dctucker

2

যদিও আপনি প্রশ্নটি কিছুটা অস্পষ্ট (কনসোল বলতে যা বোঝায়), আমি সর্বাধিক সাধারণ মামলার জন্য উত্তর দেওয়ার চেষ্টা করব: / dev / কনসোল, / দেব / টিটি, / দেব / fb0 ... এটি আপনার প্রয়োজনীয় ডিভাইসের সাথে খাপ খাইয়ে নিন। আমরা ধরে নিই যে ব্যবহারকারীর নামটি "মাইউসার"।

ডিভাইসের অনুমতিগুলি দেখুন (এটি উবুন্টু 15.04)

odroid@mbrxu3:~/projects/sc$ ls -l /dev/console
crw------- 1 root root 5, 1 Oct  23  17:49 /dev/console

odroid@mbrxu3:~/projects/sc$ ls -l /dev/tty
crw-rw-rw- 1 root tty 5, 0 Oct 24 17:50 /dev/tty

odroid@mbrxu3:~/projects/sc$ ls -l /dev/fb0 
crw-rw---- 1 root video 29, 0 Jan  1  2000 /dev/fb0

পদক্ষেপ গ্রহণ করুন

আপনার / dev / কনসোল

গোষ্ঠীটি "রুট" তবে কোনও গ্রুপ অ্যাক্সেসের অনুমতি নেই। আমি কেবলমাত্র মূল গোষ্ঠীতে অনুমতি যুক্ত করতে পছন্দ করি না, তার পরিবর্তে আমি একটি গোষ্ঠী তৈরি করি এবং ফাইলটি চিগ্রিপি করি এবং অনুমতিগুলি পরিবর্তন করি

$ sudo addgroup --system console
$ sudo chgrp console /dev/console
$ sudo chmod g+rw /dev/console
$ sudo usermod -a -G console <myuser>     <==== replace <myuser>

আপনার / dev / TTY

$ sudo usermod -a -G tty <myuser>

আপনার / dev / fb0

$ sudo usermod -a -G video <myuser> 

আপনি ব্যবহার করতে পারেন usermod খুব, সর্বোপরি গোষ্ঠীতে আপনার ব্যবহারকারী যোগ করার জন্য, যে যদি আপনার প্রয়োজন নেই কমান্ড।


-1

আমার সাম্প্রতিক অভিজ্ঞতা থেকে আপনার টিটিআই ডিভাইসে অনুমতি দেওয়ার পাশাপাশি (আগেই বলা হয়েছে) আপনাকে আরও 2 টি অতিরিক্ত জিনিস করা দরকার:

  • এক্সিকিউটেবলের জন্য ক্যাপ_সিস_টি_কনফিগ ক্ষমতা প্রদান nting আপনি যদি অজগর প্রোগ্রামটি ব্যবহার করে থাকেন তবে আপনি এটির মতো এটি করতে পারেন setcap cap_sys_tty_config+eip /usr/bin/python3.5(আপনার সাথে পাইথনের পথের বিকল্প দিন) subst অবশ্যই, আপনি যে কোনও পাইথন স্ক্রিপ্টের জন্য এই ক্ষমতাটি দিচ্ছেন তা ધ્યાનમાં রাখুন।
  • একটি নতুন ভার্চুয়াল টার্মিনালে প্রক্রিয়া চালানো, যেমন ওপেনভিটি ব্যবহার করে: openvt ./your_script.py
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.