Как заставить команду 'mail' работать правильно через SSH?

Для меня tr отлично работает как для файлов ascii, так и для файлов utf-8, если ваша ОС настроена на работу с кодовой страницей utf-8.

Вот мой пример №1 (Solaris 11):

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

Как видите, ОС настроена на работу с utf-8. Я создал оба файла в кодовой странице utf-8:

$ cat file
Bob’s Bob′s Bob's

$ cat apos
’′'

Затем я получил ожидаемые результаты, заменив все apos следующим образом:

$ cat file | tr "$(cat apos)" "xxx"
Bobxs Bobxs Bobxs

Вот мой пример №2 (Solaris 10):

$ locale
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

Здесь вы можете видеть, что эта ОС настроена для обработки простого ASCII, а не utf-8, поэтому вы можете ожидать проблем с обработкой файлов utf-8 с многобайтовыми символами с использованием tr. Но есть обходной путь.Поскольку команда long tr позволяет вводить восьмеричное представление символа, вы можете заменить все байты указанного символа восьмеричным представлением.

В вашем случае:

char  hex        octal
’     E2 80 99   \342\200\231
′     E2 80 B2   \342\200\262
'     27         \47

Первый и второй апос представлены тремя байтами. Третий - стандартный ascii (один байт).

Итак, если вы хотите заменить первый апос, вы можете использовать:

$ cat file | tr "\342\200\231" "\0\0x"
Bobxs Bob▒s Bob's

Второй:

$ cat file | tr "\342\200\262" "\0\0x"
Bob▒s Bobxs Bob's

Третий:

$ cat file | tr "\47" "x"
Bob’s Bob′s Bobxs

Чтобы заменить все одним выстрелом, вы можете использовать:

$ cat file | tr "\342\200\231\262\47" "\0\0xxx"
Bobxs Bobxs Bobxs

Конечно, это не идеально, пока это заменит все вхождения байта \342, \200, \231, \262 в файле, поэтому другие многобайтовые символы, содержащие эти байты, будут повреждены. Но если ваш файл не содержит других многобайтовых символов, он будет работать.

0
09.01.2017, 18:10
2 ответа

Я могу правильно читать почту пользователей, указав путь к файлу:

mail -f /var/spool/mail/$USER

Я также столкнулся с некоторыми проблемами при чтении электронной почты пользователя (root), Я вошел в систему с помощью ssh с пользователем phil, затем я сменил пользователя на root, набрав sudo su , а затем выполнив команду mail , которую я получил:

Нет почты для phil

Так что, похоже эта почтовая команда попытается прочитать электронную почту пользователя, с которым вы открыли ssh-соединение. И как выяснилось, причина в неправильном значении переменной $ MAIL :

[root@preprod ~]# echo $MAIL
/var/spool/mail/phil
2
28.01.2020, 02:25

попробуйте использовать sudo su - '-' позволит установить профиль и переменную среды для пользователя, которым вы являетесь переключение на которое затем позволит почтовой команде работать должным образом.

Примечание: это будет для всех переменных среды, а не только для $ MAIL.

1
28.01.2020, 02:25

Теги

Похожие вопросы