ডিভাইসের পোর্ট নির্ধারণের জন্য কমান্ড (যেমন / dev / ttyUSB0)


46

লিনাক্সের বন্দরগুলি সম্পর্কে আমার একটি প্রশ্ন আছে। আমি যদি ইউএসবি এর মাধ্যমে আমার ডিভাইসটি সংযুক্ত করি এবং তার বন্দরটি পরীক্ষা করতে চাই তবে lsusb কমান্ডটি ব্যবহার করে এটি করতে পারি না, যা কেবলমাত্র এই বাসে বাস নম্বর এবং ডিভাইস নম্বর নির্দিষ্ট করে:

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

এমন কোনও কমান্ড আছে যা আমাকে বন্দরটি বলে যে ডিভাইসটি সরাসরি সংযুক্ত রয়েছে? এখন অবধি এটি করার একমাত্র উপায় হ'ল কমান্ডটি সংযোগ বিচ্ছিন্ন করা এবং পুনরায় সংযোগ স্থাপন করা:

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

শেষ লাইনে দেখা যাবে যে আমার ডিভাইসটি / dev / ttyUSB0 এর সাথে সংযুক্ত রয়েছে ।


তুমি অর্জন করার জন্য কি চেষ্টা করতেছ? আপনি কি কোনও ডিভাইসটি /devপ্রবেশের সাথে সংযুক্ত করতে চান lsusb? অথবা আপনি /devযে সমস্ত ডিভাইসটি কোনও শারীরিক ইউএসবি ডিভাইস থেকে প্রাপ্ত তা তালিকার জন্য চান ? নাকি আপনি চাইছেন ls /dev/ttyUSB*?
প্যাট্রিক

আমার কেবল একটি কমান্ড দরকার যা আমাকে একটি ডিভাইস বন্দর দেবে এবং আমার ডিভাইস সংযোগ বিচ্ছিন্ন করতে এবং পুনরায় সংযোগ করতে আমাকে চাপ দেবে না। ls /dev/ttyUSB*কেবলমাত্র 10 টি পোর্টের তালিকা তৈরি করবে তবে এই তালিকা থেকে আমি বলতে পারি না যে আমার ডিভাইসের জন্য কোনটি।
71GA

আমি এটি সহায়ক বলে মনে করেছি।
lsusb

উত্তর:


80

আপনি যা জিজ্ঞাসা করছেন তা আমি যথেষ্ট নিশ্চিত নই। আপনি বেশ কয়েকবার 'বন্দর' উল্লেখ করেছেন, তবে তারপরে আপনার উদাহরণে আপনি উত্তরটি বলেছিলেন /dev/ttyUSB0, এটি কোনও ডিভাইস ডেথ পাথ, কোনও বন্দর নয়। সুতরাং এই উত্তরটি প্রতিটি ডিভাইসের জন্য ডেথ পাথ সন্ধান করা।

নীচে একটি দ্রুত এবং ময়লা স্ক্রিপ্ট যা ডিভাইসের মাধ্যমে পদচারনা হয় /sysএকটি সঙ্গে USB ডিভাইসের জন্য খুঁজছেন ID_SERIALঅ্যাট্রিবিউট। সাধারণত কেবল আসল ইউএসবি ডিভাইসগুলিতেই এই বৈশিষ্ট্যটি থাকবে এবং তাই আমরা এটি দিয়ে ফিল্টার করতে পারি। যদি আমরা না করি তবে আপনি তালিকায় অনেকগুলি জিনিস দেখতে পাবেন যা শারীরিক ডিভাইস নয়।

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        echo "/dev/$devname - $ID_SERIAL"
    )
done

আমার সিস্টেমে এটির ফলাফল নিম্নলিখিত:

/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard

ব্যাখ্যা:

find /sys/bus/usb/devices/usb*/ -name dev

যে ডিভাইসগুলিতে প্রদর্শিত হবে তাদের ডিরেক্টরিতে /devএকটি devফাইল রয়েছে /sys। সুতরাং আমরা এই মানদণ্ডের সাথে মেলে ডিরেক্টরিগুলি অনুসন্ধান করি।
 

syspath="${sysdevpath%/dev}"

আমরা ডিরেক্টরি পথ চাই, তাই আমরা সরিয়ে ফেলা /dev
 

devname="$(udevadm info -q name -p $syspath)"

এটি আমাদের ডিভাইসের /devসাথে সম্পর্কিত যে পথটি দেয় /sys
 

[[ "$devname" == "bus/"* ]] && continue

এটি প্রকৃত ডিভাইস নয় এমন জিনিসগুলি ফিল্টার করে। অন্যথায় আপনি ইউএসবি কন্ট্রোলার এবং হাবের মতো জিনিস পাবেন।
 

eval "$(udevadm info -q property --export -p $syspath)"

udevadm info -q property --exportকমান্ড তালিকা একটি বিন্যাসে সমস্ত ডিভাইসের বৈশিষ্ট্য যে ভেরিয়েবল মধ্যে শেল দ্বারা পার্স করা যাবে না। সুতরাং আমরা কেবল evalএই উপর কল । কোডটি প্রথম বন্ধনে আবদ্ধ করার কারণেই আমরা এই জন্য সাবস্কেল ব্যবহার করি এবং প্রতিটি লুপে ভেরিয়েবলগুলি মুছা যায়।
 

[[ -z "$ID_SERIAL" ]] && continue

প্রকৃত ডিভাইস নয় এমন জিনিসগুলির আরও ফিল্টারিং।
 

echo "/dev/$devname - $ID_SERIAL"

আমি আশা করি আপনি জানেন যে এই লাইনটি কি করে :-)


2
ধন্যবাদ. আমি আপনার আনসার থেকে অনেক কিছু শিখব এবং এখন আমি দেখতে পাচ্ছি যে শর্তগুলি আমার কাছে সম্পূর্ণ পরিষ্কার ছিল না। কোন ছোট উপায় আছে? ইতিমধ্যে একটি কমান্ড লিনাক্সে ইতিমধ্যে সংহত হতে পারে?
71GA

নাঃ। যদি পূর্ব-বিদ্যমান কমান্ড থাকে তবে আমি আনন্দের সাথে এটি সুপারিশ করব।
প্যাট্রিক

সর্বাধিক সামঞ্জস্যের জন্য / বিন /
বাশকে

10

যদি সংযুক্ত থাকে তবে আপনার ডিভাইসটি অন্বেষণ করতে আপনি এই আদেশটি ব্যবহার করতে পারেন usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

শীর্ষের উত্তরটি আমার মেশিনে কাজ করে নি, তবে এটি দুর্দান্ত কাজ করেছে। ধন্যবাদ!
johnny_boy

2

আপনি নীচের মত কিছু চেষ্টা করতে পারেন।

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev

আমার চোখ! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (সমতুল্য তবে পরিষ্কার ... তবে এখনও অদ্ভুত কোড; কেন একসাথে ttyUSB? এবং 2x রেভ কী ছিল?)
পিটার

1
revতাই গত ক্ষেত্র অ্যাক্সেস করা হয় ব্যবহার করা হয়, এই দ্বারা প্রতিস্থাপিত হতে পারে $NF: দানdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond

2

সম্ভবত আপনি কেবল ইউএসবি-সিরিয়াল অ্যাডাপ্টারের যে পথটি সর্বশেষে সংযুক্ত হয়েছে তা জানতে চান?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1

2

ধরে নিলাম যে আপনি যে ডিভাইসটি প্লাগ ইন করেছেন সেটি কী, 14.04 উবুন্টুতে কমপক্ষে, একটি আদেশ রয়েছে usb-devicesযা আপনি সন্ধান করতে এবং তথ্যটি সন্ধান করতে পারেন:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

এবং প্রথম লাইনে বাস এবং পোর্টের পাশাপাশি ডিভাইস নম্বর lsusbদেয় যা তালিকা দেয়।


এটি সঠিক উত্তর, এটি কেন বেশি ভোট দেয় না তা নিশ্চিত নয়। বাকীগুলি অবাস্তব ইত্যাদির
মেসগুলি

1
এই /dev/*পথটি দেখায় না
x 113
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.