Bu belgedeki SSH üzerinden komut çalıştırırken TTY yok


10

Burada bir belgede böyle SSH üzerinde bir komut çalıştırmak çalışıyorum:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

Normalde sudo için şifre gibi giriş gerektiren bir şey çalıştırmaya çalıştığım zaman dışında çalışır. Bu durumda, aşağıdaki mesajı alıyorum:

sudo: no tty present and no askpass program specified

-tSSH bayrağı aşağıdaki gibi bir sözde tty ayırmak için kullanabilirsiniz biliyorum :

ssh -t example.com "sudo /etc/init.d/apache2 reload"

Ve işe yarayacak, ama burada-belge ile aynı şeyi denediğimde, işe yaramıyor ve mevcut olmayan hiçbir tty ile aynı hatayı alıyorum:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Bunu nasıl yapabileceğime dair bir fikrin var mı?

Ayrıca, neden sadece aynı satıra geçmek yerine bu belgeyle çalışmasını istediğimi merak ediyorsanız, giriş komutlarının (birkaç tane olabilir) bir komut dosyası tarafından okunan bir yapılandırma dosyasından gelmesidir. ve duydum ki tırnak, çift tırnak, vb için komut kaçmak için sorun önler.

Yanıtlar:


6

visudoSudoers dosyasını düzenlemek ve aşağıdaki satırı eklemek için kullanın :

Defaults:<user>    !requiretty

Bunu kullanmanın neden ssh -t "something" versus ssh -t <<STOP something STOPişe yaramadığı cevap vermiyor. Diyelim ki sudo kullanmıyorum ama doğrudan kendi kullanıcı için passwd kullanıyorum, hala TTY'yi heredoc'u kullanarak alamıyorum.

ssh -t -tStdin bir terminal olmasa bile sözde tty tahsisini zorlamaya çalışın .


Teşekkürler, başka bir yerde bu düzeltmeyi gördüm, ama sadece sudo kullanan komutlar için sorun gider. Neden ssh -t "birşey" in yerine ssh -t << STOP komutunun çalışmadığını yanıtlamaz. Diyelim ki sudo kullanmıyorum ama doğrudan kendi kullanıcı için passwd kullanıyorum, hala TTY'yi heredoc'u kullanarak alamıyorum.
lpfavreau

Cevabımı güncelledim.
quanta

1

Neden burada belgeyi ssh -tkomut bağımsız değişkeni olarak verilecek bir değişkende saklamıyorsunuz?

Daha genel bir notta, ssh -Tuzak ana bilgisayarın stdin'i bir heredoc'tan yönlendiriliyorsa ( sshpty ayırmaya çalışmaktan kaçınmak için) uzak kabuğu komut argümanı olarak kullanın veya belirtin .

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
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.