konstruksi pipa bash untuk menambahkan sesuatu ke stdoutput dari perintah sebelumnya

25

Saya ingin menggunakan sendmail untuk mengirimi saya barang dan ingin melakukannya di oneliner.

echo "mail content" | sendmail emailataddres.com 

Mengirimnya tanpa subjek.

Baris subjek harus ada sebelum konten Mail, jadi saya mencari sesuatu di sepanjang baris:

echo "mail content" | prepend "Subject: All that matters" | sendmail emailataddres.com 

sed dan awk cenderung sangat canggung untuk digunakan dan diingat.

EDIT : Hanya untuk memperjelas: gema "Konten email" hanyalah contoh ilustrasi. Saya harus bisa menambahkan beberapa hal ke stdout stream dari sumber apa pun. misal: ifconfig, zcat, dll.

AndreasT
sumber
echo -e "Subject: All that matters\nmail content"? Atau lebih platform agnostik: printf 'Subject: %s\n%s\n' "All that matters" "mail content". Anda juga bisa menulis skrip kecil yang hanya membutuhkan dua argumen string untuk membuat satu kalimat yang lebih sederhana.
Daniel Andersson
Nah, jika Anda menambahkan ini sebagai jawaban saya mungkin menerimanya ... :)
AndreasT
ah, tidak, aku tidak, maaf. Harap perhatikan hasil edit saya.
AndreasT
Apa yang harus prependdilakukan Untuk mengetahui cara menambahkan sesuatu, Anda harus menunggu hingga perintah upstream (mis. echo) Mengirim EOF, sehingga Anda dapat memasukkan data Anda di depannya dalam aliran sebelum meneruskannya ke stdout untuk mendapatkan piped ke sendmail. Kedengarannya seperti tugas untuk skrip Ruby atau Python yang agak pendek.
allquixotic
1
Pendekatan yang sedikit berbeda adalah dengan menggunakan mailperintah (kadang-kadang disebut bsdmail) alih-alih sendmailsecara langsung. mailmengambil -s subjectopsi opsional , misalnya: ifconfig -a | mail -s 'Current ifconfig output' [email protected]
Wim Lewis

Jawaban:

43
$ echo 1 | (echo 2 && cat)
2
1

Saya cukup yakin bahwa ada solusi yang lebih baik, tetapi ini harus dilakukan.

Claudius
sumber
1
Sederhana, fungsional, dan diperagakan. +1
Hennes
Apakah ada cara mudah untuk melakukannya tanpa istirahat kembali?
VenomFangs
2
@VenomFangs Gunakan printfalih-alih yang kedua echodan Anda harus baik
Trendfischer
> Apakah ada cara mudah untuk melakukannya tanpa istirahat kembali? -echo -n
kyb
6

Gunakan apa yang dikatakan Claudius atau buat sendiri:

~ / bin / prepend:

#!/bin/sh
echo -en "$@"
cat -

misalnya:

$ echo "Splendid SUPANINJA! Let's do it!" |\
     prepend "Subject: Venetian Snares\n"

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!

Ярослав Рахматуллин
sumber
6

Ini terinspirasi oleh jawaban Claudius.

Jika Anda tidak ingin jeda antara output Anda, tambahkan -nparam. Ini akan terlihat seperti:

$ echo 1 | (echo -n 2 && cat)

Yang akan memberi:

21

VenomFangs
sumber
1
Sebenarnya, tidak, itu tidak akan terjadi. Ini memberi "2 \ n1". Anda harus melampirkan "-n" ke gema kedua . Masih +1. Jika Anda Benar, saya mungkin menerimanya. Saya tidak yakin apa yang adil, karena Claudius berkontribusi paling besar pada solusi.
AndreasT
Maaf, saya pikir saya meletakkannya -ndi tempat yang salah. Bagaimanapun, Pembaruan harus memberikan "21 \ n" jika Anda ingin menyingkirkan \ n maka tambahkan saja -n sebelum 1.
VenomFangs
1

Dari potongan-potongan yang saya kumpulkan ... Anda bisa melakukan sesuatu seperti ini:

echo "Subject: All that matters
`echo "mail content"`" | sendmail blah@blahblah

Perhatikan bahwa saya tidak menutup tanda kutip pada baris pertama ... karena tidak semua shell menerjemahkannya \nmenjadi karakter baris baru ... tapi saya belum menemukan yang tidak memproses baris baru yang sebenarnya di dalam tanda kutip.

Ketika sebuah perintah tertutup dalam karakter `, itu akan dieksekusi dan output akan disuntikkan di tempat. Ingatlah bahwa sedikit kode ini sedikit berbahaya karena dimungkinkan untuk menyuntikkan perintah tambahan yang dapat dengan mudah membahayakan sistem Anda ...

**** edit **** Mengikuti saran Claudius, opsi yang lebih bersih akan terlihat seperti ini:

echo -e "Subject: All that matters \n $(echo "mail content") |sendmail blah@blahblah

Bahkan dengan templat itu, ia dapat dieksploitasi.

TheCompWiz
sumber
1
Biasanya lebih baik untuk digunakan $()daripada `` karena seharusnya lebih portabel (dan juga lebih mudah dibaca). Selain itu, Anda dapat menggunakan echo's -epilihan untuk membuatnya menerjemahkan baris ( echo -e "1\n2") atau hanya menggunakan printf seperti yang disarankan oleh Daniel dalam komentar pertama.
Claudius
Segera setelah memposting jawaban saya ... Saya membaca jawaban Anda & lebih menyukainya. Poin bagus.
TheCompWiz
0

Anda dapat menambahkan ke output pipa menggunakan substitusi proses :

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
tepat sekali
sumber