URL'den bash betiği çalıştır


184

"Http://mywebsite.com/myscript.txt" URL'sinde bir komut dosyası içeren bir dosyam olduğunu varsayalım:

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

Ve bu komut dosyasını önce bir dosyaya kaydetmeden çalıştırmak istiyorum. Bunu nasıl yaparım?

Şimdi sözdizimini gördüm:

bash < <(curl -s http://mywebsite.com/myscript.txt)

Ancak bu, bir dosyaya kaydedip yürüttüğümde çalıştığı gibi görünmüyor. Örneğin readline çalışmaz ve çıktı sadece:

$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!

Benzer şekilde denedim:

curl -s http://mywebsite.com/myscript.txt | bash -s --

Aynı sonuçlarla.

Başlangıçta şöyle bir çözüm vardı:

timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

Ama bu özensiz görünüyor ve daha zarif bir çözüm istiyorum.

Bir URL'den kabuk komut dosyası çalıştırmayla ilgili güvenlik sorunlarının farkındayım, ancak şimdilik bunları göz ardı edelim.


3
Sonunda geçici bir dosya oluşturursanız, muhtemelen mktempkendi çözümünüzü kullanmak yerine kullanmalısınız
Hasturkun

cmd <<foo çoğu kabuklarda heredoc sözdizimi olup muhtemelen istediğiniz şey değildir.
dietbuddha

Yanıtlar:


218
source <(curl -s http://mywebsite.com/myscript.txt)

yapmalı. Alternatif olarak, standart girişi yeniden yönlendiren ilk yönlendirmeyi kendiniz bırakın; bashyeniden yönlendirme olmadan gayet güzel bir şekilde yürütmek için bir dosya adı alır ve <(command)sözdizimi bir yol sağlar.

bash <(curl -s http://mywebsite.com/myscript.txt)

Çıkışına bakarsanız daha net olabilir. echo <(cat /dev/null)


Teşekkürler, bu ne olup bittiğini açıkça ortaya koydu. Sadece merak ediyorum, bu ilk yönlendirmeyi kullanmanın avantajı nedir? Soruyorum çünkü RVM kurulumu için şu komutu kullanıyorlar: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Neden sadece: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
Küçük bir not: wget mevcuttur, ancak bukle (stok Ubuntu masaüstü sistemi üzerinde örneğin) değilse, sen yerini alabilir wget -q http://mywebsite.com/myscript.txt -O -için curl -s http://mywebsite.com/myscript.txt).
D Coetzee

5
Komut satırı argümanlarını komut dosyanıza geçiremeyeceğinizi unutmayın. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Senaryoya sahipseniz bunun gibi ortam değişkenlerini kullanabilirsiniz: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)ve bunun gibi borularla da çalışır: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashBu elbette 1 $ ve 2 $ yerine MYFLAG1 ve MYFLAG2 kullanmanızı gerektirir
Bruno Bronosky

3
$ sudo bash <(curl -s xxx ) hata aldı: bash: / dev / fd / 63: Bozuk dosya tanımlayıcı
Jake

2
İlk çözüm (kaynak kullanan çözüm) hiç işe yaramadı. İkincisi biraz çalıştı ama sınırlamaları var. Komut dosyasını bir alt kabukta URL'den yürütüyor. Ben üst kullanmak istediğiniz komut dosyasında tanımlanan bazı işlevleri var. Bunu başarmak için yine de var mı? Yoksa şanssız mıyım ve tek çözüm bu komut dosyasını geçici bir dosyaya kopyalayıp kaynaklamak mı?
Harsh Pandey

86

Bu, bazı bağımsız değişkenler (arg1 arg2) ileterek uzak komut dosyasını yürütmenin yoludur:

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2

2
Bu stty tatili: \ bash <(curl ... ) stdin kullanıyorsanız kullanın
Flores Robles

47

Bash, Bourne kabuğu ve balık için:

curl -s http://server/path/script.sh | bash -s arg1 arg2

"-S" bayrağı kabuk stdin okuma yapar.


1
kabul edilen cevap balıkla çalışmazken, bu çoğu kabukta çalışmalıdır .
hoijui

16

wgetGenellikle varsayılan sistem kurulumunun bir parçası olan şunu kullanarak :

bash <(wget -qO- http://mywebsite.com/myscript.txt)

RTFM : gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Wget çıktısını kapat." ||| -O- == --output-document = - == Dosya olarak '-' kullanılırsa, dokümanlar standart çıktıya yazdırılır.
amra

13

kullanın:

curl -s -L URL_TO_SCRIPT_HERE | bash

Örneğin:

curl -s -L http://bitly/10hA8iC | bash

12

Sadece dene:

bash <(curl -s http://mywebsite.com/myscript.txt)

11

Bunu da yapabilirsiniz:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash

11

Bunu yapmanın en iyi yolu

curl http://domain/path/to/script.sh | bash -s arg1 arg2

@ user77115 tarafından küçük bir cevap değişikliği


6

Sık sık aşağıdakileri kullanmak yeterlidir

curl -s http://mywebsite.com/myscript.txt | sh

Ancak eski bir sistemde (kernel2.4), sorunlarla karşılaşır ve aşağıdakileri çözebilir, diğerlerini denedim, sadece aşağıdaki işler

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

Örnekler

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

Sorun ağ yavaş yavaş veya ağ yavaş yavaş işleyemez bash sürümü çok eski neden olabilir

Ancak, aşağıdakiler sorunu çözer

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$

4

Ayrıca:

curl -sL https://.... | sudo bash -

3
Son şeridin anlamı ne?
towry

Bash man sayfasından: A - seçeneklerin sonunu bildirir ve daha fazla seçenek işlemeyi devre dışı bırakır. - işaretinden sonraki tüm argümanlar dosya adı ve argüman olarak değerlendirilir. - argümanı - ile eşdeğerdir.
Mingjiang Shi

3

Sadece amra ve user77115'in cevaplarını birleştirerek:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

-V -v seçeneklerini ileten bbstart.sh uzak komut dosyasını yürütür.


2

Aşağıdaki komutu kullandığım bazı katılımsız komut dosyaları mı:

sh -c "$(curl -fsSL <URL>)"

Komut dosyalarını doğrudan URL'lerden yürütmekten kaçınmanızı öneririm. URL'nin güvenli olduğundan emin olun ve çalıştırmadan önce komut dosyasının içeriğini kontrol edin, çalıştırmadan önce dosyayı doğrulamak için bir SHA256 sağlama toplamı kullanabilirsiniz.


0

Bu şekilde iyi ve geleneksel:

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#

-3
bash | curl http://your.url.here/script.txt

gerçek örnek:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 

Bu kesinlikle yanlış. Göndermeden önce komut dosyalarınızı test edin ve çıktı almayın.
korkman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.