Да, такие случаи бывают.
В случае символических ссылок в системе Linux с GNU ls
, ls -l
покажет размер ссылки, а wc -c
разрешит фактический файл и прочитает количество байтов из него. Ниже вы можете увидеть, что ls -l
сообщает о 29 байтах, а wc
сообщает о 172 байтах в фактическом файле.
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 1月 17 2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf
-rw-r--r-- 1 root root 172 1月 15 15:49 /var/run/resolvconf/resolv.conf
В случае виртуальных файловых систем , , таких как / proc
или / sys
, многие файлы там будут иметь размер 0 ls -l
. В файловой системе / dev
у нас есть множество специальных файлов, таких как символьные устройства и блочные устройства - wc -c
зависает от них и ls -l
показывает ] старшие и младшие числа вместо размера.
Именованные каналы будут сообщены как 0
байтов с помощью ls -c
, но wc -c
фактически прочитает содержимое канала, поэтому технически он скажет вам, сколько данных находится в именованном канале:
$ mkfifo named.pipe
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月 16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done echo "This is a test" >named.pipe
Для обычных файлов размер должен быть одинаковым.
Смысл ls -l
и wc -c
, а также то, как они работают, также отличается. wc -c
фактически открывает файл для чтения (вы можете увидеть, например, если вы запустите strace wc -c / etc / passwd
). ls -l
выполняет только вызов stat ()
для них. Это также объясняет, почему в / proc
ls -l
отображается нулевой размер - вы не можете определить эти файлы, потому что они не являются "настоящими" или фактически хранятся на жестком диске / ssd. wc -c
вместо этого считывает содержимое этого файла и вычисляет его размер.
Наконец, ls -l
- это всего лишь инструмент для интерактивного вывода списка элементов. Он редко подходит для написания сценариев. Если вам действительно нужно прочитать данные, используйте вместо них wc -c
.
Обратите внимание, что для написания сценариев и оценки размера файла ls
не лучший кандидат. Фактически, это одна из общепринятых практик, избегая синтаксического анализа ls
вывода . Используйте du -b
, чтобы узнать размер файла.
Есть несколько вариантов:
Выполнить команду:
sshpass -p 'password' scp filename user@host:
Установить sshpass:
sudo apt install sshpass
sshpass — неинтерактивный поставщик паролей ssh
sshpass — это утилита, предназначенная для запуска ssh в указанном режиме в качестве "клавиатурно-интерактивной" аутентификации по паролю, но в неинтерактивный режим.
ssh использует прямой доступ к телетайпу, чтобы убедиться, что пароль действительно выдается пользователем интерактивной клавиатуры. Sshpass запускает ssh в выделенный tty, обманывая его, заставляя думать, что он получает пароль от интерактивного пользователя.
Команда для запуска указывается после собственных параметров sshpass.Обычно это будет "ssh" с аргументами, но с таким же успехом может быть и любой другой команда. Однако запрос пароля, используемый ssh, в настоящее время жестко запрограммирован в sshpass.
напишите скрипт, который будет вводить пароль, как только он определит запрос пароля ssh
ИМХО - Это самый безопасный способ, не требующий использования паролей.
Использование открытого/закрытого ключа для выполнения операции ssh
или scp
без ввода пароля.
Дополнительную информацию можно найти в этом ответе
Подробную информацию можно найти здесь
Уже есть ответ, как это сделать, поэтому я сосредоточусь на том, почему нет.
ps
или любой другой список процессов. Вместо этого используйте открытый/закрытый ключ и используйте ключевой агент для временного запоминания вашего ключа.