В современном андроиде версии 4 или выше через кабель невозможно нормально добраться до главного раздела, так как доступ к нему открыт только через глючный и тормозной MTP, а с линуксом ещё хуже — там вообще нет нормальной поддержки MTP.
Многие выкручиваются так: поднимают на девайсе какой-нибудь сервер (обычно FTP), а дальше к нему подключаются через Wi-Fi; затем можно через любой FTP-клиент копировать файлы с девайса и назад. Есть и недостатки: не очень безопасно и часто очень медленно.
Но выход есть и называется он USB-tethering.
Коротко о методе:
- устанавливаем на девайс FTP-сервер (можете взять любой по вкусу в маркете);
- подключаем девайс USB-кабелем к компьютеру;
- включаем на телефоне USB-tethering;
- на компьютере запускаем FTP-клиент и подключаемся к узлу с адресом
192.168.42.129
; - поработали — отключаем USB-tethering на телефоне;
- выдёргиваем кабель.
Теперь подробности.
По умолчанию в Debian/Ubuntu уже включена поддержка сетевых USB-адаптеров; в других системах, возможно, придётся что-то пересобрать или установить нужные драйверы.
Сначала включаем USB-tethering на телефоне (эта опция доступна только после подключения кабелем к компьютеру): Settings → Wireless & Networks → More... → Tethering & portable support → USB tethering.
После этого на компьютере должен появиться новый сетевой адаптер с именем типа usb0
. Его нужно сконфигурировать на использование DHCP и обычно он получает адрес из подсети 192.168.42.0/24
(это жёстко прошито в коде андроида), при этом адрес самого девайса/телефона тоже фиксированный — 192.168.42.129
— он выступает в роли шлюза.
Дальше с компьютера лезем по адресу телефона до FTP-сервера и копируем что нужно. Так как это кабель, копирование идёт исключительно быстро.
Есть и подводные камни. Например, такое подключение может вам легко сломать резолвинг адресов, прописав всякую херню в /etc/resolv.conf
(об этом можно прочитать здесь, самый простой способ — сделать заранее chattr +i /etc/resolv.conf
, чтобы фатально запретить запись в этот файл, но вы должны чётко понимать, что делаете), может какие-нибудь маршруты похерить. Ещё вариант решения — отказаться от автоматической конфигурации сети и прописать её для устройства вручную, об этом написано чуть ниже.
Теоретически метод может работать с Windows (но я не проверял). С MacOS X по умолчанию работать точно не будет, нужна установка стороннего драйвера, например, этого.
А теперь об этом подробнее.
Я предполагаю, что вы не пользуетесь network manager, а конфигурите сеть вручную из консоли. Все инструкции для ubuntu/debian.
На современных дистрибутивах драйвер присваивает USB-девайсу имя не usb0
, а что-то типа enx010203040506
(цифры означают MAC-адрес сетевого устройства, в данном случае это 01:02:03:04:05:06
) или enp0s20u3
. Посмотреть, какое имя назначилось сетевому девайсу после включения tethering, можно командой ip:
# ip a
................
8: enx010203040506: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff
Или через dmesg (интерфейсу назначилось имя enp0s20u3):
# dmesg
...
[606354.326192] usb 3-3: New USB device found, idVendor=18d1, idProduct=4ee3
[606354.326193] usb 3-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[606354.326194] usb 3-3: Product: Nexus 5
[606354.326194] usb 3-3: Manufacturer: LGE
[606354.326195] usb 3-3: SerialNumber: 0101010101010101
[606354.344775] usbcore: registered new interface driver cdc_ether
[606354.346537] rndis_host 3-3:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-3, RNDIS device, 4e:8c:c4:61:f0:f7
[606354.346582] usbcore: registered new interface driver rndis_host
[606354.348156] rndis_host 3-3:1.0 enp0s20u3: renamed from usb0
Сначала случай, когда сетевому интерфейсу назначается имя вида enx010203040506
. Для каждого вашего андроидного девайса имя интерфейса будет своим, и для каждого такого имени нужно добавить отдельную секцию в файл /etc/network/interfaces
. Вот как это выглядит:
allow-hotplug enx010203040506
iface enx010203040506 inet static
address 192.168.42.56
netmask 255.255.255.0
Если же интерфейсу назначается имя типа enp0s20u3
, оно будет разным при подключении к разным USB-портам, при этом будет одинаковым для всех USB-девайсов, которые к этому порту подключаются. Можно для конкретного телефона назначить выделенное имя интерфейса через udev-правила. Создаём файл /etc/udev/rules.d/10-android.rules
, добавляем в него такую строчку для каждого телефона:
SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="0101010101010101", NAME="usbnexus"
Значение поля ATTRS{serial}
берём из dmesg:
[606354.326195] usb 3-3: SerialNumber: 0101010101010101
В поле NAME
прописываем желаемое имя девайса.
После изменений нужно перезагрузить udev:
sudo udevadm control --reload-rules && sudo udevadm trigger
Теперь в /etc/network/interfaces прописываем:
allow-hotplug usbnexus
iface usbnexus inet static
address 192.168.42.56
netmask 255.255.255.0
Параметры сети для каждого девайса одинаковы, просто не подключайте одновременно несколько телефонов.
Если теперь включить tethering на подключенном USB-кабелем девайсе, то интерфейс автоматически и правильно сконфигурится. Обратите внимание, что мы явно указываем параметры сети, а не пользуемся DHCP, так как нам нужен не полноценный tethering, а лишь линк до девайса, без смены дефолтного шлюза и DNS-серверов.
- Обновлено 2015-09-20: добавлена секция про ручное конфигурирование через
/etc/network/interfaces
- Обновлено 2017-01-27: добавлено информации про новые системы
"прописав всякую херню"
Это обязательно - изъясняться на жаргоне маргиналов?