it-swarm-ko.tech

명령 줄에서 USB 장치를 어떻게 재설정합니까?

PC에서 물리적으로 연결을 끊거나 연결하지 않고 USB 장치의 연결을 재설정 할 수 있습니까?

특히 내 장치는 디지털 카메라입니다. gphoto2을 (를) 사용하고 있지만 최근에 "장치 읽기 오류"가 발생하여 연결의 소프트웨어 재설정을 시도하고 싶습니다.

내가 알 수 있듯이 카메라에로드되는 커널 모듈이 없습니다. 관련된 것으로 보이는 유일한 것은 usbhid입니다.

161
cmcginty

다음을 usbreset.c로 저장하십시오.

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
    const char *filename;
    int fd;
    int rc;

    if (argc != 2) {
        fprintf(stderr, "Usage: usbreset device-filename\n");
        return 1;
    }
    filename = argv[1];

    fd = open(filename, O_WRONLY);
    if (fd < 0) {
        perror("Error opening output file");
        return 1;
    }

    printf("Resetting USB device %s\n", filename);
    rc = ioctl(fd, USBDEVFS_RESET, 0);
    if (rc < 0) {
        perror("Error in ioctl");
        return 1;
    }
    printf("Reset successful\n");

    close(fd);
    return 0;
}

터미널에서 다음 명령을 실행하십시오.

  1. 프로그램을 컴파일하십시오 :

    $ cc usbreset.c -o usbreset
    
  2. 재설정하려는 USB 장치의 버스 및 장치 ID를 가져옵니다.

    $ lsusb  
    Bus 002 Device 003: ID 0fe9:9010 DVICO  
    
  3. 컴파일 된 프로그램을 실행 가능하게 만드십시오.

    $ chmod +x usbreset
    
  4. Sudo 권한으로 프로그램을 실행하십시오. lsusb 명령을 실행하여 찾은 <Bus><Device> id를 필요한 것으로 대체하십시오.

    $ Sudo ./usbreset /dev/bus/usb/002/003  
    

위 프로그램의 소스 : http://marc.info/?l=linux-usb&m=121459435621262&w=2

114
Li Lo

이전에 특정 상황에서 나 자신을 찾지 못했기 때문에 그것이 충분할 지 확신 할 수 없지만 USB 장치를 재설정하는 가장 간단한 방법은 다음 명령입니다. (외부 앱 필요 없음)

Sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
Sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"

Libfreenect가 다시 절전 모드로 전환하기위한 API가없는 것 같아서 Kinect를 재설정하는 데 실제로 사용합니다. 내 젠투 상자에 있지만 커널은 sysfs에 대해 동일한 경로 구조를 사용할 수있을 정도로 새 것이어야합니다.

분명히 1-4.6는 아니지만 커널 로그 (dmesg)에서 해당 장치 경로를 가져 오거나 lsusb과 같은 것을 사용하여 공급 업체 및 제품 ID를 얻은 다음 경로가 다른 공급 업체/제품 ID 쌍과 관련되는 방법을 나열하려면 다음과 같은 빠른 명령을 사용하십시오.

for X in /sys/bus/usb/devices/*; do 
    echo "$X"
    cat "$X/idVendor" 2>/dev/null 
    cat "$X/idProduct" 2>/dev/null
    echo
done
57
ssokolow

모든 USB1/2/3 연결 포트가 재설정됩니다 [1] :

for i in /sys/bus/pci/drivers/[uoex]hci_hcd/*:*; do
  [ -e "$i" ] || continue
  echo "${i##*/}" > "${i%/*}/unbind"
  echo "${i##*/}" > "${i%/*}/bind"
done

나는 이것이 당신의 문제를 해결할 것이라고 믿습니다. 모든 USB 엔드 포인트를 재설정하지 않으려면 /sys/bus/pci/drivers/ehci_hcd에서 적절한 장치 ID를 사용할 수 있습니다.


참고 : [1] : *hci_hcd 커널 드라이버는 일반적으로 USB 포트를 제어합니다. ohci_hcduhci_hcd은 USB1.1 포트 용, ehci_hcd는 USB2 포트 용, xhci_hcd은 USB3 포트 용입니다. ( https://en.wikipedia.org/wiki/Host_controller_interface_ (USB, _Firewire) 참조)

49
Tamás Tapsonyi

이것을 python 스크립트에서 자동화해야하므로 LiLo의 다음과 같은 매우 유용한 답변을 수정했습니다.

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl
driver = sys.argv[-1]
print "resetting driver:", driver
USBDEVFS_RESET= 21780

try:
    lsusb_out = Popen("lsusb | grep -i %s"%driver, Shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().split()
    bus = lsusb_out[1]
    device = lsusb_out[3][:-1]
    f = open("/dev/bus/usb/%s/%s"%(bus, device), 'w', os.O_WRONLY)
    fcntl.ioctl(f, USBDEVFS_RESET, 0)
except Exception, msg:
    print "failed to reset device:", msg

내 경우에는 cp210x 드라이버 (lsmod | grep usbserial에서 알 수 있음)이므로 위의 스 니펫을 reset_usb.py로 저장 한 다음 다음을 수행하십시오.

Sudo python reset_usb.py cp210x

시스템에 c 컴파일러 설정이 없지만 파이썬이있는 경우에도 도움이 될 수 있습니다.

10
Peter

여기에 대한 답변을 기반으로 전체 프로세스를 단순화하는 Python 스크립트를 만들었습니다.

아래 스크립트를 reset_usb.py 또는 클론 this repo 로 저장하십시오.

용법:

python reset_usb.py help  # Show this help
Sudo python reset_usb.py list  # List all USB devices
Sudo python reset_usb.py path /dev/bus/usb/XXX/YYY  # Reset USB device using path /dev/bus/usb/XXX/YYY
Sudo python reset_usb.py search "search terms"  # Search for USB device using the search terms within the search string returned by list and reset matching device
Sudo python reset_usb.py listpci  # List all PCI USB devices
Sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X  # Reset PCI USB device using path /sys/bus/pci/drivers/.../XXXX:XX:XX.X
Sudo python reset_usb.py searchpci "search terms"  # Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device

스크립트:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl

instructions = '''
Usage: python reset_usb.py help : Show this help
       Sudo python reset_usb.py list : List all USB devices
       Sudo python reset_usb.py path /dev/bus/usb/XXX/YYY : Reset USB device using path /dev/bus/usb/XXX/YYY
       Sudo python reset_usb.py search "search terms" : Search for USB device using the search terms within the search string returned by list and reset matching device
       Sudo python reset_usb.py listpci : List all PCI USB devices
       Sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X : Reset PCI USB device using path
       Sudo python reset_usb.py searchpci "search terms" : Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device       
       '''


if len(sys.argv) < 2:
    print(instructions)
    sys.exit(0)

option = sys.argv[1].lower()
if 'help' in option:
    print(instructions)
    sys.exit(0)


def create_pci_list():
    pci_usb_list = list()
    try:
        lspci_out = Popen('lspci -Dvmm', Shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8')
        pci_devices = lspci_out.split('%s%s' % (os.linesep, os.linesep))
        for pci_device in pci_devices:
            device_dict = dict()
            categories = pci_device.split(os.linesep)
            for category in categories:
                key, value = category.split('\t')
                device_dict[key[:-1]] = value.strip()
            if 'USB' not in device_dict['Class']:
                continue
            for root, dirs, files in os.walk('/sys/bus/pci/drivers/'):
                slot = device_dict['Slot']
                if slot in dirs:
                    device_dict['path'] = os.path.join(root, slot)
                    break
            pci_usb_list.append(device_dict)
    except Exception as ex:
        print('Failed to list pci devices! Error: %s' % ex)
        sys.exit(-1)
    return pci_usb_list


def create_usb_list():
    device_list = list()
    try:
        lsusb_out = Popen('lsusb -v', Shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8')
        usb_devices = lsusb_out.split('%s%s' % (os.linesep, os.linesep))
        for device_categories in usb_devices:
            if not device_categories:
                continue
            categories = device_categories.split(os.linesep)
            device_stuff = categories[0].strip().split()
            bus = device_stuff[1]
            device = device_stuff[3][:-1]
            device_dict = {'bus': bus, 'device': device}
            device_info = ' '.join(device_stuff[6:])
            device_dict['description'] = device_info
            for category in categories:
                if not category:
                    continue
                categoryinfo = category.strip().split()
                if categoryinfo[0] == 'iManufacturer':
                    manufacturer_info = ' '.join(categoryinfo[2:])
                    device_dict['manufacturer'] = manufacturer_info
                if categoryinfo[0] == 'iProduct':
                    device_info = ' '.join(categoryinfo[2:])
                    device_dict['device'] = device_info
            path = '/dev/bus/usb/%s/%s' % (bus, device)
            device_dict['path'] = path

            device_list.append(device_dict)
    except Exception as ex:
        print('Failed to list usb devices! Error: %s' % ex)
        sys.exit(-1)
    return device_list


if 'listpci' in option:
    pci_usb_list = create_pci_list()
    for device in pci_usb_list:
        print('path=%s' % device['path'])
        print('    manufacturer=%s' % device['SVendor'])
        print('    device=%s' % device['SDevice'])
        print('    search string=%s %s' % (device['SVendor'], device['SDevice']))
    sys.exit(0)

if 'list' in option:
    usb_list = create_usb_list()
    for device in usb_list:
        print('path=%s' % device['path'])
        print('    description=%s' % device['description'])
        print('    manufacturer=%s' % device['manufacturer'])
        print('    device=%s' % device['device'])
        print('    search string=%s %s %s' % (device['description'], device['manufacturer'], device['device']))
    sys.exit(0)

if len(sys.argv) < 3:
    print(instructions)
    sys.exit(0)

option2 = sys.argv[2]

print('Resetting device: %s' % option2)


# echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind;echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind
def reset_pci_usb_device(dev_path):
    folder, slot = os.path.split(dev_path)
    try:
        fp = open(os.path.join(folder, 'unbind'), 'wt')
        fp.write(slot)
        fp.close()
        fp = open(os.path.join(folder, 'bind'), 'wt')
        fp.write(slot)
        fp.close()
        print('Successfully reset %s' % dev_path)
        sys.exit(0)
    except Exception as ex:
        print('Failed to reset device! Error: %s' % ex)
        sys.exit(-1)


if 'pathpci' in option:
    reset_pci_usb_device(option2)


if 'searchpci' in option:
    pci_usb_list = create_pci_list()
    for device in pci_usb_list:
        text = '%s %s' % (device['SVendor'], device['SDevice'])
        if option2 in text:
            reset_pci_usb_device(device['path'])
    print('Failed to find device!')
    sys.exit(-1)


def reset_usb_device(dev_path):
    USBDEVFS_RESET = 21780
    try:
        f = open(dev_path, 'w', os.O_WRONLY)
        fcntl.ioctl(f, USBDEVFS_RESET, 0)
        print('Successfully reset %s' % dev_path)
        sys.exit(0)
    except Exception as ex:
        print('Failed to reset device! Error: %s' % ex)
        sys.exit(-1)


if 'path' in option:
    reset_usb_device(option2)


if 'search' in option:
    usb_list = create_usb_list()
    for device in usb_list:
        text = '%s %s %s' % (device['description'], device['manufacturer'], device['device'])
        if option2 in text:
            reset_usb_device(device['path'])
    print('Failed to find device!')
    sys.exit(-1)
7
mcarans

문제의 특별한 경우는 gphoto2와 USB가 연결된 카메라의 통신 문제이므로 gphoto2에는 USB 연결을 재설정하는 옵션이 있습니다.

gphoto2 --reset

아마도이 옵션은 질문이있을 때 2010 년에 존재하지 않았을 수도 있습니다.

4
mviereck

장치 번호에 따라 특정 USB 장치를 재설정하는 python 스크립트를 만들었습니다. lsusb 명령에서 장치 번호를 찾을 수 있습니다.

예를 들면 다음과 같습니다.

$ lsusb

Bus 002 Device 004: ID 046d:c312 Logitech, Inc. DeLuxe 250 Keyboard

이 문자열에서 004는 장치 번호입니다

import os
import argparse
import subprocess

path='/sys/bus/usb/devices/'

def runbash(cmd):
    p = subprocess.Popen(cmd, Shell=True, stdout=subprocess.PIPE)
    out = p.stdout.read().strip()
    return out

def reset_device(dev_num):
    sub_dirs = []
    for root, dirs, files in os.walk(path):
            for name in dirs:
                    sub_dirs.append(os.path.join(root, name))

    dev_found = 0
    for sub_dir in sub_dirs:
            if True == os.path.isfile(sub_dir+'/devnum'):
                    fd = open(sub_dir+'/devnum','r')
                    line = fd.readline()
                    if int(dev_num) == int(line):
                            print ('Your device is at: '+sub_dir)
                            dev_found = 1
                            break

                    fd.close()

    if dev_found == 1:
            reset_file = sub_dir+'/authorized'
            runbash('echo 0 > '+reset_file) 
            runbash('echo 1 > '+reset_file) 
            print ('Device reset successful')

    else:
            print ("No such device")

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-d', '--devnum', dest='devnum')
    args = parser.parse_args()

    if args.devnum is None:
            print('Usage:usb_reset.py -d <device_number> \nThe device    number can be obtained from lsusb command result')
            return

    reset_device(args.devnum)

if __name__=='__main__':
    main()
3
Raghu

재설정하는 가장 빠른 방법은 USB 컨트롤러 자체를 재설정하는 것입니다. 이렇게하면 연결이 끊어지면 udev가 장치 등록을 취소하게되며 활성화하면 등록이 다시 시작됩니다.

echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind

대부분의 PC 환경에서 작동합니다. 그러나 일부 사용자 지정 하드웨어를 사용하는 경우 간단히 장치 이름을 반복 할 수 있습니다. 이 방법을 사용하면 lsusb로 장치 이름을 찾을 필요가 없습니다. 자동화 된 스크립트에도 통합 할 수 있습니다.

3
chandank

모듈을 다시로드하여 일종의 슬레지 해머를 사용하고 있습니다. 이것은 내 usb_reset.sh 스크립트입니다.

#!/bin/bash

# USB drivers
rmmod xhci_pci
rmmod ehci_pci

# uncomment if you have firewire
#rmmod ohci_pci

modprobe xhci_pci
modprobe ehci_pci

# uncomment if you have firewire
#modprobe ohci_pci

그리고 이것은 내 diplay 관리자가 시작된 후 usb_reset.sh를 실행하는 시스템 서비스 파일 /usr/lib/systemd/system/usbreset.service입니다.

[Unit]
Description=usbreset Service
After=gdm.service
Wants=gdm.service

[Service]
Type=oneshot
ExecStart=/path/to/usb_reset.sh

다음은 일치하는 제품/공급 업체 ID 만 재설정하는 스크립트입니다.

#!/bin/bash

set -euo pipefail
IFS=$'\n\t'

VENDOR="045e"
PRODUCT="0719"

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done
2
cmcginty

특정 USB 장치를 재설정하기 위해 간단한 bash 스크립트를 만들었습니다.

#!/bin/bash
#type lsusb to find "vendor" and "product" ID in terminal
set -euo pipefail
IFS=$'\n\t'

#edit the below two lines of vendor and product values using lsusb result
dev=$(lsusb -t | grep usbdevicename | grep 'If 1' | cut -d' ' -f13|cut -d"," -f1)
#VENDOR=05a3
#PRODUCT=9230
VENDOR=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f1)
PRODUCT=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f2)

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done
1
Thoht

때로는 VID (공급 업체 ID) 및 PID (제품 ID)로 식별되는 특정 장치에서이 작업을 수행하려고합니다. 이것은 멋진 libusb 라이브러리를 사용하는이 목적에 유용한 스크립트입니다.

첫 실행 :

Sudo apt-get install libusb-dev

그런 다음이 C++ 파일의 resetDeviceConnection은 vid 및 pid로 식별 된대로 장치 연결을 재설정하는이 태스크를 수행해야합니다.

#include <libusb-1.0/libusb.h>

int resetDeviceConnection(UINT_16 vid, UINT_16 pid){
    /*Open libusb*/
    int resetStatus = 0;
    libusb_context * context;
    libusb_init(&context);

    libusb_device_handle * dev_handle = libusb_open_device_with_vid_pid(context,vid,pid);
    if (dev_handle == NULL){
      printf("usb resetting unsuccessful! No matching device found, or error encountered!\n");
      resetStatus = 1;
    }
    else{
      /*reset the device, if one was found*/
      resetStatus = libusb_reset_device(dev_handle);
    }
    /*exit libusb*/
    libusb_exit(context);
    return resetStatus;
}

(개인 TIL 카탈로그에서 도난당한 경우 : https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )

1
Marviel

누군가 망치를 주문 했습니까? 이것은 여러 가지 다른 답변과 함께 정리되어 있습니다.

#!/bin/bash

# Root required
if (( UID )); then
        exec Sudo "$0" "[email protected]"
fi

cd /sys/bus/pci/drivers

function reinit {(
        local d="$1"
        test -e "$d" || return

        rmmod "$d"

        cd "$d"

        for i in $(ls | grep :); do
                echo "$i" > unbind
        done

        sleep 1

        for i in $(ls | grep :); do
                echo "$i" > bind
        done

        modprobe "$d"

)}

for d in ?hci_???; do
        echo " - $d"
        reinit "$d"
done
1
Mark K Cowan

이것을 시도하십시오, 그것은 소프트웨어 플러그를 뽑습니다 (꺼내기).

때로는 일부 장치의 경우 단순히 바인딩 해제 장치가 작동하지 않습니다.

예:

"Genius NetScroll 120"을 제거하거나 꺼내고 싶습니다.

그런 다음 먼저 연결된 USB 장치를 확인하십시오.

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 03f0:231d Hewlett-Packard 
Bus 001 Device 004: ID 138a:0007 Validity Sensors, Inc. VFS451 Fingerprint Reader
Bus 001 Device 005: ID 04f2:b163 Chicony Electronics Co., Ltd 
Bus 002 Device 009: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120  **<----This my Mouse! XDDD**

좋아, 내 마우스를 찾았습니다. 버스 002, 장치 009, idVendor 0458 및 idProduct 003a가 있으므로 마우스에 대한 참조 장치 정보입니다.

이것은 버스 번호가 장치의 시작 이름 경로이며 중요한 장치를 제거하기 위해 제품 ID 및 공급 업체를 확인하는 것이 중요합니다.

$ ls /sys/bus/usb/drivers/usb/
1-1/    1-1.1/  1-1.3/  1-1.5/  2-1/    2-1.3/  bind    uevent  unbind  usb1/   usb2/

폴더에주의를 기울이고 폴더 번호 2로 시작하는 것을 확인하십시오. 버스가 002이기 때문에이 폴더를 확인하고 하나씩 마우스 정보에 대해 올바른 idVendor 및 idProduct를 포함하는 각 폴더를 확인합니다.

이 경우 다음 명령으로 정보를 검색합니다.

cat /sys/bus/usb/drivers/usb/2-1.3/idVendor
0458
cat /sys/bus/usb/drivers/usb/2-1.3/idProduct
003a

좋아, /sys/bus/usb/drivers/usb/2-1.3/ 경로가 내 정보 마우스와 일치합니다! XDDD.

이제 장치를 제거해야합니다!

su -c "echo 1 > /sys/bus/usb/drivers/usb/2-1.3/remove"

USB 장치를 다시 연결하면 다시 작동합니다!

0
user242078

장치 이름을 알고 있으면이 python 스크립트가 작동합니다.

#!/usr/bin/python
"""
USB Reset

Call as "usbreset.py <device_file_path>"

With device_file_path like "/dev/bus/usb/bus_number/device_number"
"""
import fcntl, sys, os

USBDEVFS_RESET = ord('U') << (4*2) | 20

def main():
    fd = os.open(sys.argv[1], os.O_WRONLY)
    if fd < 0: sys.exit(1)
    fcntl.ioctl(fd, USBDEVFS_RESET, 0)
    os.close(fd)
    sys.exit(0)
# end main

if __== '__main__':
    main()
0
Clay

아마도 이것은 카메라에서도 작동합니다.

다음으로 USB 3.0 (kernel.org) 리눅스에서 굶주린 3.4.42 HDD를 부활 시켰습니다. dmesg에 따르면 360 년대 이후 명령이 시간 초과되고 (죄송합니다. 네트워크에 연결되어 있지 않고 여기에서 syslog를 복사 할 수 없습니다) 드라이브가 완전히 중단되었다고합니다. 장치에 액세스하는 프로세스는 커널에서 차단되어 처리 할 수 ​​없습니다. NFS 중단, ZFS 중단, dd 중단.

이렇게 한 후에 모든 것이 다시 작동했습니다. dmesg 님이 USB 기기를 찾았다는 내용을 한 줄로 말했습니다.

다음 내용이 무엇인지 자세히 알지 못합니다. 그러나 효과가있었습니다.

다음 예제 출력은 2.6.32-5-686 커널을 가진 Debian Squeeze의 출력이므로 2.6 이상에서 작동한다고 생각합니다.

$ ls -al /dev/sdb
brw-rw---T 1 root floppy 8, 16 Jun  3 20:24 /dev/sdb

$ ls -al /sys/dev/block/8:16/device/rescan
--w------- 1 root root 4096 Jun  6 01:46 /sys/dev/block/8:16/device/rescan

$ echo 1 > /sys/dev/block/8:16/device/rescan

이것이 작동하지 않으면 다른 사람이 장치에 실제 재설정을 보내는 방법을 알아낼 수 있습니다.

0
Tino