Как реализовать отправку команды со страницы на Django по SSH?
Вопрос по поводу реализации отправки SSH со страницы в Django. Необходимо, чтобы При нажатии кнопки отправлялась команда по SSH на сервер. Есть такой код с использованием Paramiko:
views.py
class StartServer(Server, View):
def get(self, request, *args, **kwargs):
form = AddServerForm(request.POST or None)
servers = Server.objects.all()
context = {'form': form, 'csservers': servers}
return render(request, 'csservers/server_detail.html', context)
# def post(self, request, *args, **kwargs):
# pass
def start_server(self, request, pk):
print(request.POST)
if request.POST:
server = Server.objects.get(id=pk)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=server.host, username=server.server_username, password=server.secret, port=server.port)
stdin, stdout, stderr = client.exec_command('./<команда>')
data = stdout.read() + stderr.read()
client.close()
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ server.host }}
{{ server.port }}
{{ server.server_username }}
{{ server.secret }}
<form action="{% url 'server_start' server.slug server.id %}" method="post">
{% csrf_token %}
<button type="submit" style="outline: none; border: none; background-color: red; color: #fff;">Запустить сервер</button>
</form>
</body>
</html>
Если нажимаю на кнопку, то выдает ошибку 405. Мне нужно, чтобы на локальную машину с Ubuntu по SSH происходило подключение и отправлялась команда ./<комада>. Возможно ли как-то более логично и локанично реализовать данную идею или возможно при помощи Paramiko все же это сделать?
В итоге получилось реализовать то, что хотел. В итоге получилось сделать вот так: views.py
class StartServer(Server, View):
def get(self, request, *args, **kwargs):
form = AddServerForm(request.POST or None)
servers = Server.objects.all()
context = {'form': form, 'csservers': servers}
return render(request, 'csservers/server_detail.html', context)
def post(self, request, pk):
server = Server.objects.get(id=pk)
if request.POST:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=server.host, username=server.server_username, password=server.secret,
port=server.port)
stdin, stdout, stderr = client.exec_command('./csgoserver st')
data = stdout.read() + stderr.read()
client.close()
return redirect(server.get_absolute_url())
return redirect(server.get_absolute_url())
HTML:
<form action="{% url 'server_start' server.id %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<button type="submit" style="outline: none; border: none; background-color: red; color: #fff;">Запустить сервер</button>
</form>
urls.py
urlpatterns = [
path('servers', ServerListView.as_view(), name='servers'),
path('servers/<slug:slug>', ServerDetailView.as_view(), name='servers_detail'),
path('servers_add/', AddServer.as_view(), name='server_add'),
path('server_start/<int:pk>', StartServer.as_view(), name='server_start'),
]